public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup
@ 2025-04-11 16:37 Neeraj Sanjay Kale
  2025-04-11 16:37 ` [PATCH v1 2/2] Bluetooth: btnxpuart: Implement host-wakeup feature Neeraj Sanjay Kale
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Neeraj Sanjay Kale @ 2025-04-11 16:37 UTC (permalink / raw)
  To: marcel, luiz.dentz, robh, krzk+dt, conor+dt
  Cc: linux-bluetooth, linux-kernel, devicetree, amitkumar.karwar,
	neeraj.sanjaykale, sherry.sun, manjeet.gupta

Add support for host-wakeup on GPIO interrupt.

Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
---
 .../devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml  | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
index d02e9dd847ef..ab1411c05f49 100644
--- a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
+++ b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
@@ -48,6 +48,12 @@ properties:
     description:
       The GPIO number of the NXP chipset used for BT_WAKE_IN.
 
+  host-wakeup-gpios:
+    maxItems: 1
+    description:
+      Host wakeup by falling edge interrupt on this GPIO which
+      is connected to BT_WAKE_OUT pin of the NXP chipset.
+
   nxp,wakeout-pin:
     $ref: /schemas/types.yaml#/definitions/uint8
     description:
@@ -68,6 +74,7 @@ examples:
             firmware-name = "uartuart8987_bt_v0.bin";
             device-wakeup-gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
             nxp,wakein-pin = /bits/ 8 <18>;
+            host-wakeup-gpios = <&gpio 12 GPIO_ACTIVE_HIGH>;
             nxp,wakeout-pin = /bits/ 8 <19>;
             local-bd-address = [66 55 44 33 22 11];
         };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 2/2] Bluetooth: btnxpuart: Implement host-wakeup feature
  2025-04-11 16:37 [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup Neeraj Sanjay Kale
@ 2025-04-11 16:37 ` Neeraj Sanjay Kale
  2025-04-11 17:05 ` [v1,1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup bluez.test.bot
  2025-04-11 22:08 ` [PATCH v1 1/2] " Rob Herring
  2 siblings, 0 replies; 5+ messages in thread
From: Neeraj Sanjay Kale @ 2025-04-11 16:37 UTC (permalink / raw)
  To: marcel, luiz.dentz, robh, krzk+dt, conor+dt
  Cc: linux-bluetooth, linux-kernel, devicetree, amitkumar.karwar,
	neeraj.sanjaykale, sherry.sun, manjeet.gupta

This implements host-wakeup feature by reading the device tree property
host-wakeup-gpios and nxp,wakeout-pin, and configuring the
host-wakeup-gpio as a FALLING EDGE triggered interrupt pin.

When host is suspended, a trigger from the WAKE_OUT pin of the
controller wakes it up.

To enable this feature, both device tree properties are needed to be
defined.

Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
---
 drivers/bluetooth/btnxpuart.c | 66 +++++++++++++++++++++++++++++++----
 1 file changed, 60 insertions(+), 6 deletions(-)

diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
index 604ab2bba231..265f6bb1c533 100644
--- a/drivers/bluetooth/btnxpuart.c
+++ b/drivers/bluetooth/btnxpuart.c
@@ -17,6 +17,8 @@
 #include <linux/crc32.h>
 #include <linux/string_helpers.h>
 #include <linux/gpio/consumer.h>
+#include <linux/of_irq.h>
+#include <linux/suspend.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -144,6 +146,8 @@ struct ps_data {
 	u16   h2c_ps_interval;
 	u16   c2h_ps_interval;
 	struct gpio_desc *h2c_ps_gpio;
+	struct gpio_desc *c2h_ps_gpio;
+	s32 irq_handler;
 	struct hci_dev *hdev;
 	struct work_struct work;
 	struct timer_list ps_timer;
@@ -476,11 +480,13 @@ static void ps_timeout_func(struct timer_list *t)
 	}
 }
 
+static irqreturn_t btnxpuart_host_wakeup_irq_handler(int irq, void *priv);
 static int ps_setup(struct hci_dev *hdev)
 {
 	struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
 	struct serdev_device *serdev = nxpdev->serdev;
 	struct ps_data *psdata = &nxpdev->psdata;
+	int ret;
 
 	psdata->h2c_ps_gpio = devm_gpiod_get_optional(&serdev->dev, "device-wakeup",
 						      GPIOD_OUT_LOW);
@@ -493,11 +499,41 @@ static int ps_setup(struct hci_dev *hdev)
 	if (device_property_read_u8(&serdev->dev, "nxp,wakein-pin", &psdata->h2c_wakeup_gpio)) {
 		psdata->h2c_wakeup_gpio = 0xff; /* 0xff: use default pin/gpio */
 	} else if (!psdata->h2c_ps_gpio) {
-		bt_dev_warn(hdev, "nxp,wakein-pin property without device-wakeup GPIO");
+		bt_dev_warn(hdev, "nxp,wakein-pin property without device-wakeup-gpios");
 		psdata->h2c_wakeup_gpio = 0xff;
 	}
 
-	device_property_read_u8(&serdev->dev, "nxp,wakeout-pin", &psdata->c2h_wakeup_gpio);
+	psdata->c2h_ps_gpio = devm_gpiod_get_optional(&serdev->dev, "host-wakeup",
+						      GPIOD_IN);
+	if (IS_ERR(psdata->c2h_ps_gpio)) {
+		bt_dev_err(hdev, "Error fetching host-wakeup-gpios: %ld",
+			   PTR_ERR(psdata->h2c_ps_gpio));
+		return PTR_ERR(psdata->c2h_ps_gpio);
+	}
+
+	if (device_property_read_u8(&serdev->dev, "nxp,wakeout-pin", &psdata->c2h_wakeup_gpio)) {
+		psdata->c2h_wakeup_gpio = 0xff;
+		if (psdata->c2h_ps_gpio) {
+			bt_dev_warn(hdev, "host-wakeup-gpios property without nxp,wakeout-pin");
+			gpiod_put(psdata->c2h_ps_gpio);
+			psdata->c2h_ps_gpio = NULL;
+		}
+	} else if (!psdata->c2h_ps_gpio) {
+		bt_dev_warn(hdev, "nxp,wakeout-pin property without host-wakeup-gpios");
+		psdata->c2h_wakeup_gpio = 0xff;
+	}
+
+	if (psdata->c2h_ps_gpio) {
+		psdata->irq_handler = gpiod_to_irq(psdata->c2h_ps_gpio);
+		bt_dev_dbg(nxpdev->hdev, "host-wakeup irq_handler: %d", psdata->irq_handler);
+
+		ret = devm_request_irq(&serdev->dev, psdata->irq_handler,
+				       btnxpuart_host_wakeup_irq_handler,
+				       IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
+				       dev_name(&serdev->dev), nxpdev);
+		disable_irq(psdata->irq_handler);
+		device_init_wakeup(&serdev->dev, true);
+	}
 
 	psdata->hdev = hdev;
 	INIT_WORK(&psdata->work, ps_work_func);
@@ -637,12 +673,10 @@ static void ps_init(struct hci_dev *hdev)
 
 	psdata->ps_state = PS_STATE_AWAKE;
 
-	if (psdata->c2h_wakeup_gpio) {
+	if (psdata->c2h_wakeup_gpio != 0xff)
 		psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_GPIO;
-	} else {
+	else
 		psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE;
-		psdata->c2h_wakeup_gpio = 0xff;
-	}
 
 	psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID;
 	if (psdata->h2c_ps_gpio)
@@ -1697,6 +1731,15 @@ static size_t btnxpuart_receive_buf(struct serdev_device *serdev,
 	return count;
 }
 
+static irqreturn_t btnxpuart_host_wakeup_irq_handler(int irq, void *priv)
+{
+	struct btnxpuart_dev *nxpdev = (struct btnxpuart_dev *)priv;
+
+	bt_dev_dbg(nxpdev->hdev, "Host wakeup interrupt");
+
+	return IRQ_HANDLED;
+}
+
 static void btnxpuart_write_wakeup(struct serdev_device *serdev)
 {
 	serdev_device_write_wakeup(serdev);
@@ -1821,6 +1864,12 @@ static int nxp_serdev_suspend(struct device *dev)
 	struct ps_data *psdata = &nxpdev->psdata;
 
 	ps_control(psdata->hdev, PS_STATE_SLEEP);
+
+	if (psdata->irq_handler > 0 &&
+	    device_may_wakeup(&nxpdev->serdev->dev)) {
+		enable_irq_wake(psdata->irq_handler);
+		enable_irq(psdata->irq_handler);
+	}
 	return 0;
 }
 
@@ -1829,6 +1878,11 @@ static int nxp_serdev_resume(struct device *dev)
 	struct btnxpuart_dev *nxpdev = dev_get_drvdata(dev);
 	struct ps_data *psdata = &nxpdev->psdata;
 
+	if (psdata->irq_handler > 0) {
+		disable_irq(psdata->irq_handler);
+		disable_irq_wake(psdata->irq_handler);
+	}
+
 	ps_control(psdata->hdev, PS_STATE_AWAKE);
 	return 0;
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* RE: [v1,1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup
  2025-04-11 16:37 [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup Neeraj Sanjay Kale
  2025-04-11 16:37 ` [PATCH v1 2/2] Bluetooth: btnxpuart: Implement host-wakeup feature Neeraj Sanjay Kale
@ 2025-04-11 17:05 ` bluez.test.bot
  2025-04-11 22:08 ` [PATCH v1 1/2] " Rob Herring
  2 siblings, 0 replies; 5+ messages in thread
From: bluez.test.bot @ 2025-04-11 17:05 UTC (permalink / raw)
  To: linux-bluetooth, neeraj.sanjaykale

[-- Attachment #1: Type: text/plain, Size: 2276 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=952573

---Test result---

Test Summary:
CheckPatch                    PENDING   0.28 seconds
GitLint                       PENDING   0.24 seconds
SubjectPrefix                 FAIL      5.69 seconds
BuildKernel                   PASS      27.95 seconds
CheckAllWarning               PASS      26.82 seconds
CheckSparse                   PASS      30.17 seconds
BuildKernel32                 PASS      23.89 seconds
TestRunnerSetup               PASS      458.34 seconds
TestRunner_l2cap-tester       PASS      20.98 seconds
TestRunner_iso-tester         PASS      32.79 seconds
TestRunner_bnep-tester        PASS      4.84 seconds
TestRunner_mgmt-tester        FAIL      122.61 seconds
TestRunner_rfcomm-tester      PASS      7.79 seconds
TestRunner_sco-tester         PASS      12.44 seconds
TestRunner_ioctl-tester       PASS      8.32 seconds
TestRunner_mesh-tester        PASS      6.12 seconds
TestRunner_smp-tester         PASS      7.19 seconds
TestRunner_userchan-tester    PASS      4.98 seconds
IncrementalBuild              PENDING   0.78 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: SubjectPrefix - FAIL
Desc: Check subject contains "Bluetooth" prefix
Output:
"Bluetooth: " prefix is not specified in the subject
##############################
Test: TestRunner_mgmt-tester - FAIL
Desc: Run mgmt-tester with test-runner
Output:
Total: 490, Passed: 483 (98.6%), Failed: 3, Not Run: 4

Failed Test Cases
LL Privacy - Set Flags 1 (Add to RL)                 Failed       0.138 seconds
LL Privacy - Set Flags 2 (Enable RL)                 Failed       0.135 seconds
LL Privacy - Set Flags 3 (2 Devices to RL)           Failed       0.187 seconds
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup
  2025-04-11 16:37 [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup Neeraj Sanjay Kale
  2025-04-11 16:37 ` [PATCH v1 2/2] Bluetooth: btnxpuart: Implement host-wakeup feature Neeraj Sanjay Kale
  2025-04-11 17:05 ` [v1,1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup bluez.test.bot
@ 2025-04-11 22:08 ` Rob Herring
  2025-04-14 17:25   ` [EXT] " Neeraj Sanjay Kale
  2 siblings, 1 reply; 5+ messages in thread
From: Rob Herring @ 2025-04-11 22:08 UTC (permalink / raw)
  To: Neeraj Sanjay Kale
  Cc: marcel, luiz.dentz, krzk+dt, conor+dt, linux-bluetooth,
	linux-kernel, devicetree, amitkumar.karwar, sherry.sun,
	manjeet.gupta

On Fri, Apr 11, 2025 at 10:07:18PM +0530, Neeraj Sanjay Kale wrote:
> Add support for host-wakeup on GPIO interrupt.
> 
> Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
> ---
>  .../devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml  | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> index d02e9dd847ef..ab1411c05f49 100644
> --- a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> +++ b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> @@ -48,6 +48,12 @@ properties:
>      description:
>        The GPIO number of the NXP chipset used for BT_WAKE_IN.
>  
> +  host-wakeup-gpios:
> +    maxItems: 1
> +    description:
> +      Host wakeup by falling edge interrupt on this GPIO which
> +      is connected to BT_WAKE_OUT pin of the NXP chipset.

Read the description in the Broadcom binding you copied this from. 
Define this as an interrupt named 'wakeup', not a GPIO. After all, to be 
a wake-up source, it kind of has to be an interrupt.

Just because I said no to putting wakeup source handling in serdev, 
doesn't mean the binding should change. The handling just has to be in 
the driver.

Rob

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [EXT] Re: [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup
  2025-04-11 22:08 ` [PATCH v1 1/2] " Rob Herring
@ 2025-04-14 17:25   ` Neeraj Sanjay Kale
  0 siblings, 0 replies; 5+ messages in thread
From: Neeraj Sanjay Kale @ 2025-04-14 17:25 UTC (permalink / raw)
  To: Rob Herring
  Cc: marcel@holtmann.org, luiz.dentz@gmail.com, krzk+dt@kernel.org,
	conor+dt@kernel.org, linux-bluetooth@vger.kernel.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	Amitkumar Karwar, Sherry Sun, Manjeet Gupta

Hi Rob,

Thank you for reviewing this patch.
I have sent out a v2 patch with bindings containing interrupt and wakeup-source.

I am not sure if I should mention the "wakeup-source" property, as this already has a property called "interrupt-names" with value "wakeup".

Please help me suggest if I should remove the "wakeup-source" property.

Thanks,
Neeraj 

> On Fri, Apr 11, 2025 at 10:07:18PM +0530, Neeraj Sanjay Kale wrote:
> > Add support for host-wakeup on GPIO interrupt.
> >
> > Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
> > ---
> >  .../devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml  | 7
> > +++++++
> >  1 file changed, 7 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> > b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> > index d02e9dd847ef..ab1411c05f49 100644
> > ---
> > a/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
> > +++ b/Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.y
> > +++ aml
> > @@ -48,6 +48,12 @@ properties:
> >      description:
> >        The GPIO number of the NXP chipset used for BT_WAKE_IN.
> >
> > +  host-wakeup-gpios:
> > +    maxItems: 1
> > +    description:
> > +      Host wakeup by falling edge interrupt on this GPIO which
> > +      is connected to BT_WAKE_OUT pin of the NXP chipset.
> 
> Read the description in the Broadcom binding you copied this from.
> Define this as an interrupt named 'wakeup', not a GPIO. After all, to be a
> wake-up source, it kind of has to be an interrupt.
> 
> Just because I said no to putting wakeup source handling in serdev, doesn't
> mean the binding should change. The handling just has to be in the driver.
> 
> Rob

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-04-14 17:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-11 16:37 [PATCH v1 1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup Neeraj Sanjay Kale
2025-04-11 16:37 ` [PATCH v1 2/2] Bluetooth: btnxpuart: Implement host-wakeup feature Neeraj Sanjay Kale
2025-04-11 17:05 ` [v1,1/2] dt-bindings: net: bluetooth: nxp: Add support for host-wakeup bluez.test.bot
2025-04-11 22:08 ` [PATCH v1 1/2] " Rob Herring
2025-04-14 17:25   ` [EXT] " Neeraj Sanjay Kale

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox