diff mbox series

power: sequencing: qcom-wcn: don't request BT enable GPIOs for wcn7850

Message ID 20240702114103.16068-1-brgl@bgdev.pl (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series power: sequencing: qcom-wcn: don't request BT enable GPIOs for wcn7850 | expand

Commit Message

Bartosz Golaszewski July 2, 2024, 11:41 a.m. UTC
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

Due to having many existing users of wcn7850 in the kernel, conversion
of the hci_qca driver to using pwrseq exclusively must be done
carefully. Right now, the Bluetooth driver requests and controls the BT
enable GPIO and so the PMU pwrseq driver must not do it or we will run
into problems depending on the probe ordering.

Add a flag that tells the driver not to request the BT-enable GPIO. We
will remove it once the conversion of the Bluetooth driver is complete.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
 drivers/power/sequencing/pwrseq-qcom-wcn.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Dmitry Baryshkov July 2, 2024, 11:42 a.m. UTC | #1
On Tue, 2 Jul 2024 at 14:41, Bartosz Golaszewski <brgl@bgdev.pl> wrote:
>
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> Due to having many existing users of wcn7850 in the kernel, conversion
> of the hci_qca driver to using pwrseq exclusively must be done
> carefully. Right now, the Bluetooth driver requests and controls the BT
> enable GPIO and so the PMU pwrseq driver must not do it or we will run
> into problems depending on the probe ordering.
>
> Add a flag that tells the driver not to request the BT-enable GPIO. We
> will remove it once the conversion of the Bluetooth driver is complete.

This will not prevent the pinctrl conflict if both PMU and BT devices
declare pinctrl for the BT_EN pin.

>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
>  drivers/power/sequencing/pwrseq-qcom-wcn.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
Bartosz Golaszewski July 2, 2024, 11:48 a.m. UTC | #2
On Tue, Jul 2, 2024 at 1:42 PM Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> On Tue, 2 Jul 2024 at 14:41, Bartosz Golaszewski <brgl@bgdev.pl> wrote:
> >
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> >
> > Due to having many existing users of wcn7850 in the kernel, conversion
> > of the hci_qca driver to using pwrseq exclusively must be done
> > carefully. Right now, the Bluetooth driver requests and controls the BT
> > enable GPIO and so the PMU pwrseq driver must not do it or we will run
> > into problems depending on the probe ordering.
> >
> > Add a flag that tells the driver not to request the BT-enable GPIO. We
> > will remove it once the conversion of the Bluetooth driver is complete.
>
> This will not prevent the pinctrl conflict if both PMU and BT devices
> declare pinctrl for the BT_EN pin.
>

Hmm... So maybe we'll need to modify the BT driver after all. Should
we see if we have the enable-gpios property in hci_qca and - if not -
try to use the power sequencer? Or prioritize the sequencer first and
if it doesn't match, then fall-back to the current mode of operation?

Bart
Dmitry Baryshkov July 2, 2024, 1:08 p.m. UTC | #3
On Tue, 2 Jul 2024 at 14:48, Bartosz Golaszewski <brgl@bgdev.pl> wrote:
>
> On Tue, Jul 2, 2024 at 1:42 PM Dmitry Baryshkov
> <dmitry.baryshkov@linaro.org> wrote:
> >
> > On Tue, 2 Jul 2024 at 14:41, Bartosz Golaszewski <brgl@bgdev.pl> wrote:
> > >
> > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > >
> > > Due to having many existing users of wcn7850 in the kernel, conversion
> > > of the hci_qca driver to using pwrseq exclusively must be done
> > > carefully. Right now, the Bluetooth driver requests and controls the BT
> > > enable GPIO and so the PMU pwrseq driver must not do it or we will run
> > > into problems depending on the probe ordering.
> > >
> > > Add a flag that tells the driver not to request the BT-enable GPIO. We
> > > will remove it once the conversion of the Bluetooth driver is complete.
> >
> > This will not prevent the pinctrl conflict if both PMU and BT devices
> > declare pinctrl for the BT_EN pin.
> >
>
> Hmm... So maybe we'll need to modify the BT driver after all. Should
> we see if we have the enable-gpios property in hci_qca and - if not -
> try to use the power sequencer? Or prioritize the sequencer first and
> if it doesn't match, then fall-back to the current mode of operation?

I'd say, try powerseq first, then fallback to enable-gpio.
diff mbox series

Patch

diff --git a/drivers/power/sequencing/pwrseq-qcom-wcn.c b/drivers/power/sequencing/pwrseq-qcom-wcn.c
index 42dacfda745e..68bcd6ec4269 100644
--- a/drivers/power/sequencing/pwrseq-qcom-wcn.c
+++ b/drivers/power/sequencing/pwrseq-qcom-wcn.c
@@ -22,6 +22,7 @@  struct pwrseq_qcom_wcn_pdata {
 	size_t num_vregs;
 	unsigned int pwup_delay_ms;
 	unsigned int gpio_enable_delay_ms;
+	bool no_bt_gpio;
 };
 
 struct pwrseq_qcom_wcn_ctx {
@@ -212,6 +213,11 @@  static const struct pwrseq_qcom_wcn_pdata pwrseq_wcn7850_of_data = {
 	.vregs = pwrseq_wcn7850_vregs,
 	.num_vregs = ARRAY_SIZE(pwrseq_wcn7850_vregs),
 	.pwup_delay_ms = 50,
+	/*
+	 * FIXME: Remove it once the entire hci_qca driver is converted to
+	 * using the power sequencer.
+	 */
+	.no_bt_gpio = true,
 };
 
 static int pwrseq_qcom_wcn_match(struct pwrseq_device *pwrseq,
@@ -277,10 +283,13 @@  static int pwrseq_qcom_wcn_probe(struct platform_device *pdev)
 		return dev_err_probe(dev, ret,
 				     "Failed to get all regulators\n");
 
-	ctx->bt_gpio = devm_gpiod_get_optional(dev, "bt-enable", GPIOD_OUT_LOW);
-	if (IS_ERR(ctx->bt_gpio))
-		return dev_err_probe(dev, PTR_ERR(ctx->bt_gpio),
-				     "Failed to get the Bluetooth enable GPIO\n");
+	if (!ctx->pdata->no_bt_gpio) {
+		ctx->bt_gpio = devm_gpiod_get_optional(dev, "bt-enable",
+						       GPIOD_OUT_LOW);
+		if (IS_ERR(ctx->bt_gpio))
+			return dev_err_probe(dev, PTR_ERR(ctx->bt_gpio),
+					     "Failed to get the Bluetooth enable GPIO\n");
+	}
 
 	ctx->wlan_gpio = devm_gpiod_get_optional(dev, "wlan-enable",
 						 GPIOD_OUT_LOW);