The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq
@ 2026-07-21  3:04 Sherry Sun (OSS)
  2026-08-05  2:59 ` Sherry Sun (OSS)
  2026-08-06 19:54 ` patchwork-bot+bluetooth
  0 siblings, 2 replies; 3+ messages in thread
From: Sherry Sun (OSS) @ 2026-07-21  3:04 UTC (permalink / raw)
  To: amitkumar.karwar, neeraj.sanjaykale, marcel, luiz.dentz
  Cc: imx, linux-kernel, linux-bluetooth, sherry.sun

From: Sherry Sun <sherry.sun@nxp.com>

Power supply to the M.2 Bluetooth device attached to the host using M.2
connector is controlled using the 'uart' pwrseq device. So add support
for getting the pwrseq device if the OF graph link is present.

Once obtained, pwrseq_power_on() is called to power up the M.2 Bluetooth
card. The power sequencer descriptor is obtained via pwrseq_get() with
the UART controller device (serdev->ctrl->dev), since the OF graph
link is defined on the UART controller node.

Also add the explicit pwrseq_put() call in all exit paths, pwrseq_put()
already calls pwrseq_power_off() internally, so no separate
pwrseq_power_off() call is needed.

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
---
Changes in V7:
1. Seperate this Bluetooth patch from the V6 M.2 patch set so that it
can be applied directly to bluetooth-next tree, no code change.
https://lore.kernel.org/all/20260713023435.235765-1-sherry.sun@oss.nxp.com/
---
 drivers/bluetooth/btnxpuart.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
index 0bb300eef157..81a11ac05114 100644
--- a/drivers/bluetooth/btnxpuart.c
+++ b/drivers/bluetooth/btnxpuart.c
@@ -9,6 +9,8 @@
 
 #include <linux/serdev.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
+#include <linux/pwrseq/consumer.h>
 #include <linux/skbuff.h>
 #include <linux/unaligned.h>
 #include <linux/firmware.h>
@@ -211,6 +213,7 @@ struct btnxpuart_dev {
 
 	struct ps_data psdata;
 	struct btnxpuart_data *nxp_data;
+	struct pwrseq_desc *pwrseq;
 	struct reset_control *pdn;
 	struct hci_uart hu;
 };
@@ -1872,11 +1875,26 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
 		return err;
 	}
 
+	if (of_graph_is_present(dev_of_node(&serdev->ctrl->dev))) {
+		struct pwrseq_desc *pwrseq;
+
+		pwrseq = pwrseq_get(&serdev->ctrl->dev, "uart");
+		if (IS_ERR(pwrseq))
+			return dev_err_probe(&serdev->dev, PTR_ERR(pwrseq),
+					     "failed to get pwrseq\n");
+
+		nxpdev->pwrseq = pwrseq;
+		err = pwrseq_power_on(pwrseq);
+		if (err)
+			goto err_pwrseq_put;
+	}
+
 	/* Initialize and register HCI device */
 	hdev = hci_alloc_dev();
 	if (!hdev) {
 		dev_err(&serdev->dev, "Can't allocate HCI device\n");
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto err_pwrseq_put;
 	}
 
 	reset_control_deassert(nxpdev->pdn);
@@ -1907,13 +1925,16 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
 	if (bacmp(&ba, BDADDR_ANY))
 		hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
 
-	if (hci_register_dev(hdev) < 0) {
+	err = hci_register_dev(hdev);
+	if (err < 0) {
 		dev_err(&serdev->dev, "Can't register HCI device\n");
 		goto probe_fail;
 	}
 
-	if (ps_setup(hdev))
+	if (ps_setup(hdev)) {
+		err = -ENODEV;
 		goto probe_fail_unregister;
+	}
 
 	hci_devcd_register(hdev, nxp_coredump, nxp_coredump_hdr,
 			   nxp_coredump_notify);
@@ -1925,7 +1946,10 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
 probe_fail:
 	reset_control_assert(nxpdev->pdn);
 	hci_free_dev(hdev);
-	return -ENODEV;
+err_pwrseq_put:
+	if (nxpdev->pwrseq)
+		pwrseq_put(nxpdev->pwrseq);
+	return err;
 }
 
 static void nxp_serdev_remove(struct serdev_device *serdev)
@@ -1952,6 +1976,8 @@ static void nxp_serdev_remove(struct serdev_device *serdev)
 	ps_cleanup(nxpdev);
 	hci_unregister_dev(hdev);
 	reset_control_assert(nxpdev->pdn);
+	if (nxpdev->pwrseq)
+		pwrseq_put(nxpdev->pwrseq);
 	hci_free_dev(hdev);
 }
 

base-commit: 3fe08b9796f36ef437ab9328e7dd1e5ff2d66603
-- 
2.50.1


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

* Re: [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq
  2026-07-21  3:04 [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq Sherry Sun (OSS)
@ 2026-08-05  2:59 ` Sherry Sun (OSS)
  2026-08-06 19:54 ` patchwork-bot+bluetooth
  1 sibling, 0 replies; 3+ messages in thread
From: Sherry Sun (OSS) @ 2026-08-05  2:59 UTC (permalink / raw)
  To: amitkumar.karwar, neeraj.sanjaykale, marcel, luiz.dentz
  Cc: imx, linux-kernel, linux-bluetooth, sherry.sun


Hi Luiz,

Gentle ping ...

On Tue, Jul 21, 2026 at 11:04:58AM +0800, Sherry Sun (OSS) wrote:
>From: Sherry Sun <sherry.sun@nxp.com>
>
>Power supply to the M.2 Bluetooth device attached to the host using M.2
>connector is controlled using the 'uart' pwrseq device. So add support
>for getting the pwrseq device if the OF graph link is present.
>
>Once obtained, pwrseq_power_on() is called to power up the M.2 Bluetooth
>card. The power sequencer descriptor is obtained via pwrseq_get() with
>the UART controller device (serdev->ctrl->dev), since the OF graph
>link is defined on the UART controller node.
>
>Also add the explicit pwrseq_put() call in all exit paths, pwrseq_put()
>already calls pwrseq_power_off() internally, so no separate
>pwrseq_power_off() call is needed.
>
>Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
>Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
>Reviewed-by: Frank Li <Frank.Li@nxp.com>
>Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
>---
>Changes in V7:
>1. Seperate this Bluetooth patch from the V6 M.2 patch set so that it
>can be applied directly to bluetooth-next tree, no code change.
>https://lore.kernel.org/all/20260713023435.235765-1-sherry.sun@oss.nxp.com/
>---
> drivers/bluetooth/btnxpuart.c | 34 ++++++++++++++++++++++++++++++----
> 1 file changed, 30 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
>index 0bb300eef157..81a11ac05114 100644
>--- a/drivers/bluetooth/btnxpuart.c
>+++ b/drivers/bluetooth/btnxpuart.c
>@@ -9,6 +9,8 @@
>
> #include <linux/serdev.h>
> #include <linux/of.h>
>+#include <linux/of_graph.h>
>+#include <linux/pwrseq/consumer.h>
> #include <linux/skbuff.h>
> #include <linux/unaligned.h>
> #include <linux/firmware.h>
>@@ -211,6 +213,7 @@ struct btnxpuart_dev {
>
> 	struct ps_data psdata;
> 	struct btnxpuart_data *nxp_data;
>+	struct pwrseq_desc *pwrseq;
> 	struct reset_control *pdn;
> 	struct hci_uart hu;
> };
>@@ -1872,11 +1875,26 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
> 		return err;
> 	}
>
>+	if (of_graph_is_present(dev_of_node(&serdev->ctrl->dev))) {
>+		struct pwrseq_desc *pwrseq;
>+
>+		pwrseq = pwrseq_get(&serdev->ctrl->dev, "uart");
>+		if (IS_ERR(pwrseq))
>+			return dev_err_probe(&serdev->dev, PTR_ERR(pwrseq),
>+					     "failed to get pwrseq\n");
>+
>+		nxpdev->pwrseq = pwrseq;
>+		err = pwrseq_power_on(pwrseq);
>+		if (err)
>+			goto err_pwrseq_put;
>+	}
>+
> 	/* Initialize and register HCI device */
> 	hdev = hci_alloc_dev();
> 	if (!hdev) {
> 		dev_err(&serdev->dev, "Can't allocate HCI device\n");
>-		return -ENOMEM;
>+		err = -ENOMEM;
>+		goto err_pwrseq_put;
> 	}
>
> 	reset_control_deassert(nxpdev->pdn);
>@@ -1907,13 +1925,16 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
> 	if (bacmp(&ba, BDADDR_ANY))
> 		hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
>
>-	if (hci_register_dev(hdev) < 0) {
>+	err = hci_register_dev(hdev);
>+	if (err < 0) {
> 		dev_err(&serdev->dev, "Can't register HCI device\n");
> 		goto probe_fail;
> 	}
>
>-	if (ps_setup(hdev))
>+	if (ps_setup(hdev)) {
>+		err = -ENODEV;
> 		goto probe_fail_unregister;
>+	}
>
> 	hci_devcd_register(hdev, nxp_coredump, nxp_coredump_hdr,
> 			   nxp_coredump_notify);
>@@ -1925,7 +1946,10 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
> probe_fail:
> 	reset_control_assert(nxpdev->pdn);
> 	hci_free_dev(hdev);
>-	return -ENODEV;
>+err_pwrseq_put:
>+	if (nxpdev->pwrseq)
>+		pwrseq_put(nxpdev->pwrseq);
>+	return err;
> }
>
> static void nxp_serdev_remove(struct serdev_device *serdev)
>@@ -1952,6 +1976,8 @@ static void nxp_serdev_remove(struct serdev_device *serdev)
> 	ps_cleanup(nxpdev);
> 	hci_unregister_dev(hdev);
> 	reset_control_assert(nxpdev->pdn);
>+	if (nxpdev->pwrseq)
>+		pwrseq_put(nxpdev->pwrseq);
> 	hci_free_dev(hdev);
> }
>
>
>base-commit: 3fe08b9796f36ef437ab9328e7dd1e5ff2d66603
>-- 
>2.50.1
>

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

* Re: [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq
  2026-07-21  3:04 [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq Sherry Sun (OSS)
  2026-08-05  2:59 ` Sherry Sun (OSS)
@ 2026-08-06 19:54 ` patchwork-bot+bluetooth
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+bluetooth @ 2026-08-06 19:54 UTC (permalink / raw)
  To: Sherry Sun
  Cc: amitkumar.karwar, neeraj.sanjaykale, marcel, luiz.dentz, imx,
	linux-kernel, linux-bluetooth, sherry.sun

Hello:

This patch was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Tue, 21 Jul 2026 11:04:58 +0800 you wrote:
> From: Sherry Sun <sherry.sun@nxp.com>
> 
> Power supply to the M.2 Bluetooth device attached to the host using M.2
> connector is controlled using the 'uart' pwrseq device. So add support
> for getting the pwrseq device if the OF graph link is present.
> 
> Once obtained, pwrseq_power_on() is called to power up the M.2 Bluetooth
> card. The power sequencer descriptor is obtained via pwrseq_get() with
> the UART controller device (serdev->ctrl->dev), since the OF graph
> link is defined on the UART controller node.
> 
> [...]

Here is the summary with links:
  - [V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq
    https://git.kernel.org/bluetooth/bluetooth-next/c/c424d3c907ec

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2026-08-06 19:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-21  3:04 [PATCH V7] Bluetooth: btnxpuart: Add M.2 Bluetooth device support using pwrseq Sherry Sun (OSS)
2026-08-05  2:59 ` Sherry Sun (OSS)
2026-08-06 19:54 ` patchwork-bot+bluetooth

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