linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi
       [not found] <20161213233658.atGuNCNY@smtp1h.mail.yandex.net>
@ 2016-12-16 12:47 ` Maxime Ripard
       [not found]   ` <4720181481899200@web7g.yandex.ru>
  0 siblings, 1 reply; 5+ messages in thread
From: Maxime Ripard @ 2016-12-16 12:47 UTC (permalink / raw)
  To: Icenowy Zheng
  Cc: Hans de Goede, linux-kernel, linux-arm-kernel, devicetree, Chen-Yu Tsai

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

On Fri, Dec 09, 2016 at 07:49:00PM +0800, Icenowy Zheng wrote:
> 
> 2016年12月9日 下午4:07于 Maxime Ripard <maxime.ripard@free-electrons.com>写道:
> >
> > On Tue, Dec 06, 2016 at 04:08:38PM +0800, Icenowy Zheng wrote: 
> > > Some SDIO Wi-Fi chips (such as RTL8703AS) have a UART bluetooth, which 
> > > has a dedicated enable pin (PL8 in the reference design). 
> > > 
> > > Enable the pin in the same way as the WLAN enable pins. 
> > > 
> > > Tested on an A33 Q8 tablet with RTL8703AS. 
> > > 
> > > Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> 
> > > --- 
> > > 
> > > This patch should be coupled with the uart1 node patch I send before: 
> > > http://lists.infradead.org/pipermail/linux-arm-kernel/2016-December/471997.html 
> > > 
> > > For RTL8703AS, the rtl8723bs bluetooth code is used, which can be retrieve from: 
> > > https://github.com/lwfinger/rtl8723bs_bt 
> > > 
> > >  arch/arm/boot/dts/sun8i-q8-common.dtsi | 2 +- 
> > >  1 file changed, 1 insertion(+), 1 deletion(-) 
> > > 
> > > diff --git a/arch/arm/boot/dts/sun8i-q8-common.dtsi b/arch/arm/boot/dts/sun8i-q8-common.dtsi 
> > > index c676940..4aeb5bb 100644 
> > > --- a/arch/arm/boot/dts/sun8i-q8-common.dtsi 
> > > +++ b/arch/arm/boot/dts/sun8i-q8-common.dtsi 
> > > @@ -88,7 +88,7 @@ 
> > >  
> > >  &r_pio { 
> > >  wifi_pwrseq_pin_q8: wifi_pwrseq_pin@0 { 
> > > - pins = "PL6", "PL7", "PL11"; 
> > > + pins = "PL6", "PL7", "PL8", "PL11"; 
> > >  function = "gpio_in"; 
> > >  bias-pull-up; 
> > >  }; 
> >
> > There's several things wrong here. The first one is that you rely 
> > solely on the pinctrl state to maintain a reset line. This is very 
> > fragile (especially since the GPIO pinctrl state are likely to go away 
> > at some point), but it also means that if your driver wants to recover 
> > from that situation at some point, it won't work. 
> >
> > The other one is that the bluetooth and wifi chips are two devices in 
> > linux, and you assign that pin to the wrong device (wifi). 
> >
> > rfkill-gpio is made just for that, so please use it. 
> 
> The GPIO is not for the radio, but for the full Bluetooth part.

I know.

> If it's set to 0, then the bluetooth part will reset, and the
> hciattach will fail.

Both rfkill-gpio and rfkill-regulator will shutdown when called
(either by poking the reset pin or shutting down the regulator), so
that definitely seems like an expected behavior to put the device in
reset.

> The BSP uses this as a rfkill, and the result is that the bluetooth
> on/off switch do not work properly.

Then rfkill needs fixing, but working around it by hoping that the
core will probe an entirely different device, and enforcing a default
that the rest of the kernel might or might not change is both fragile
and wrong.

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

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

* Re: [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi
       [not found]   ` <4720181481899200@web7g.yandex.ru>
@ 2016-12-19 10:09     ` Maxime Ripard
       [not found]       ` <11985541482156512@web2g.yandex.ru>
  0 siblings, 1 reply; 5+ messages in thread
From: Maxime Ripard @ 2016-12-19 10:09 UTC (permalink / raw)
  To: Icenowy Zheng
  Cc: Hans de Goede, linux-kernel, linux-arm-kernel, devicetree, Chen-Yu Tsai

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

On Fri, Dec 16, 2016 at 10:40:00PM +0800, Icenowy Zheng wrote:
> >>  > >  &r_pio {
> >>  > >  wifi_pwrseq_pin_q8: wifi_pwrseq_pin@0 {
> >>  > > - pins = "PL6", "PL7", "PL11";
> >>  > > + pins = "PL6", "PL7", "PL8", "PL11";
> >>  > >  function = "gpio_in";
> >>  > >  bias-pull-up;
> >>  > >  };
> >>  >
> >>  > There's several things wrong here. The first one is that you rely
> >>  > solely on the pinctrl state to maintain a reset line. This is very
> >>  > fragile (especially since the GPIO pinctrl state are likely to go away
> >>  > at some point), but it also means that if your driver wants to recover
> >>  > from that situation at some point, it won't work.
> >>  >
> >>  > The other one is that the bluetooth and wifi chips are two devices in
> >>  > linux, and you assign that pin to the wrong device (wifi).
> >>  >
> >>  > rfkill-gpio is made just for that, so please use it.
> >>
> >>  The GPIO is not for the radio, but for the full Bluetooth part.
> >
> > I know.
> >
> >>  If it's set to 0, then the bluetooth part will reset, and the
> >>  hciattach will fail.
> >
> > Both rfkill-gpio and rfkill-regulator will shutdown when called
> > (either by poking the reset pin or shutting down the regulator), so
> > that definitely seems like an expected behavior to put the device in
> > reset.
> >
> >>  The BSP uses this as a rfkill, and the result is that the bluetooth
> >>  on/off switch do not work properly.
> >
> > Then rfkill needs fixing, but working around it by hoping that the
> > core will probe an entirely different device, and enforcing a default
> > that the rest of the kernel might or might not change is both fragile
> > and wrong.
> 
> I think a rfkill-gpio here works just like the BSP rfkill...
> 
> The real problem is that the Realtek UART bluetooth driver is a userspace
> program (a modified hciattach), which is not capable of the GPIO reset...

Can't you run rfkill before attaching? What is the problem exactly?
It's not in reset for long enough?

This seems more and more like an issue in the BT stack you're
using. We might consider workarounds in the kernel, but they have to
be correct.

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

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

* Re: [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi
       [not found]       ` <11985541482156512@web2g.yandex.ru>
@ 2016-12-19 14:24         ` Chen-Yu Tsai
  2016-12-20 13:50           ` Maxime Ripard
  0 siblings, 1 reply; 5+ messages in thread
From: Chen-Yu Tsai @ 2016-12-19 14:24 UTC (permalink / raw)
  To: Icenowy Zheng
  Cc: Maxime Ripard, Hans de Goede, linux-kernel, linux-arm-kernel,
	devicetree, Chen-Yu Tsai

On Mon, Dec 19, 2016 at 10:08 PM, Icenowy Zheng <icenowy@aosc.xyz> wrote:
>
>
> 19.12.2016, 18:09, "Maxime Ripard" <maxime.ripard@free-electrons.com>:
>> On Fri, Dec 16, 2016 at 10:40:00PM +0800, Icenowy Zheng wrote:
>>>  >>  > >  &r_pio {
>>>  >>  > >  wifi_pwrseq_pin_q8: wifi_pwrseq_pin@0 {
>>>  >>  > > - pins = "PL6", "PL7", "PL11";
>>>  >>  > > + pins = "PL6", "PL7", "PL8", "PL11";
>>>  >>  > >  function = "gpio_in";
>>>  >>  > >  bias-pull-up;
>>>  >>  > >  };
>>>  >>  >
>>>  >>  > There's several things wrong here. The first one is that you rely
>>>  >>  > solely on the pinctrl state to maintain a reset line. This is very
>>>  >>  > fragile (especially since the GPIO pinctrl state are likely to go away
>>>  >>  > at some point), but it also means that if your driver wants to recover
>>>  >>  > from that situation at some point, it won't work.
>>>  >>  >
>>>  >>  > The other one is that the bluetooth and wifi chips are two devices in
>>>  >>  > linux, and you assign that pin to the wrong device (wifi).
>>>  >>  >
>>>  >>  > rfkill-gpio is made just for that, so please use it.
>>>  >>
>>>  >>  The GPIO is not for the radio, but for the full Bluetooth part.
>>>  >
>>>  > I know.
>>>  >
>>>  >>  If it's set to 0, then the bluetooth part will reset, and the
>>>  >>  hciattach will fail.
>>>  >
>>>  > Both rfkill-gpio and rfkill-regulator will shutdown when called
>>>  > (either by poking the reset pin or shutting down the regulator), so
>>>  > that definitely seems like an expected behavior to put the device in
>>>  > reset.
>>>  >
>>>  >>  The BSP uses this as a rfkill, and the result is that the bluetooth
>>>  >>  on/off switch do not work properly.
>>>  >
>>>  > Then rfkill needs fixing, but working around it by hoping that the
>>>  > core will probe an entirely different device, and enforcing a default
>>>  > that the rest of the kernel might or might not change is both fragile
>>>  > and wrong.
>>>
>>>  I think a rfkill-gpio here works just like the BSP rfkill...
>>>
>>>  The real problem is that the Realtek UART bluetooth driver is a userspace
>>>  program (a modified hciattach), which is not capable of the GPIO reset...
>>
>> Can't you run rfkill before attaching? What is the problem exactly?
>> It's not in reset for long enough?
>>
>> This seems more and more like an issue in the BT stack you're
>> using. We might consider workarounds in the kernel, but they have to
>> be correct.
>
> One more rfkill interface will be generated for hci0 after hciattach, which can
> be safely toggled block and unblock.
>
> However, if the GPIO is toggled down, the hciattach program will die.
>
> The bluetooth stack I used is fd.o's BlueZ.

I think the bigger issue is that the tty/serial subsystem does not have
power sequencing support. Here we're trying to use rfkill to do that,
but that doesn't seem to be what it was intended for. It might work with
standalone USB bluetooth controllers that don't need any special setup,
since the device will just appear and get registered. But it might not
work so well with UART based adapters that need userspace fiddling with
firmware and hciattach.

And like Icenowy mentioned, the bluetooth stack registers another rfkill
control, which presumable just blocks transmissions.

Regards
ChenYu

>
>>
>> Maxime
>>
>> --
>> Maxime Ripard, Free Electrons
>> Embedded Linux and Kernel engineering
>> http://free-electrons.com

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

* Re: [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi
  2016-12-19 14:24         ` Chen-Yu Tsai
@ 2016-12-20 13:50           ` Maxime Ripard
  0 siblings, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2016-12-20 13:50 UTC (permalink / raw)
  To: Chen-Yu Tsai
  Cc: Icenowy Zheng, Hans de Goede, linux-kernel, linux-arm-kernel, devicetree

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

On Mon, Dec 19, 2016 at 10:24:44PM +0800, Chen-Yu Tsai wrote:
> On Mon, Dec 19, 2016 at 10:08 PM, Icenowy Zheng <icenowy@aosc.xyz> wrote:
> >
> >
> > 19.12.2016, 18:09, "Maxime Ripard" <maxime.ripard@free-electrons.com>:
> >> On Fri, Dec 16, 2016 at 10:40:00PM +0800, Icenowy Zheng wrote:
> >>>  >>  > >  &r_pio {
> >>>  >>  > >  wifi_pwrseq_pin_q8: wifi_pwrseq_pin@0 {
> >>>  >>  > > - pins = "PL6", "PL7", "PL11";
> >>>  >>  > > + pins = "PL6", "PL7", "PL8", "PL11";
> >>>  >>  > >  function = "gpio_in";
> >>>  >>  > >  bias-pull-up;
> >>>  >>  > >  };
> >>>  >>  >
> >>>  >>  > There's several things wrong here. The first one is that you rely
> >>>  >>  > solely on the pinctrl state to maintain a reset line. This is very
> >>>  >>  > fragile (especially since the GPIO pinctrl state are likely to go away
> >>>  >>  > at some point), but it also means that if your driver wants to recover
> >>>  >>  > from that situation at some point, it won't work.
> >>>  >>  >
> >>>  >>  > The other one is that the bluetooth and wifi chips are two devices in
> >>>  >>  > linux, and you assign that pin to the wrong device (wifi).
> >>>  >>  >
> >>>  >>  > rfkill-gpio is made just for that, so please use it.
> >>>  >>
> >>>  >>  The GPIO is not for the radio, but for the full Bluetooth part.
> >>>  >
> >>>  > I know.
> >>>  >
> >>>  >>  If it's set to 0, then the bluetooth part will reset, and the
> >>>  >>  hciattach will fail.
> >>>  >
> >>>  > Both rfkill-gpio and rfkill-regulator will shutdown when called
> >>>  > (either by poking the reset pin or shutting down the regulator), so
> >>>  > that definitely seems like an expected behavior to put the device in
> >>>  > reset.
> >>>  >
> >>>  >>  The BSP uses this as a rfkill, and the result is that the bluetooth
> >>>  >>  on/off switch do not work properly.
> >>>  >
> >>>  > Then rfkill needs fixing, but working around it by hoping that the
> >>>  > core will probe an entirely different device, and enforcing a default
> >>>  > that the rest of the kernel might or might not change is both fragile
> >>>  > and wrong.
> >>>
> >>>  I think a rfkill-gpio here works just like the BSP rfkill...
> >>>
> >>>  The real problem is that the Realtek UART bluetooth driver is a userspace
> >>>  program (a modified hciattach), which is not capable of the GPIO reset...
> >>
> >> Can't you run rfkill before attaching? What is the problem exactly?
> >> It's not in reset for long enough?
> >>
> >> This seems more and more like an issue in the BT stack you're
> >> using. We might consider workarounds in the kernel, but they have to
> >> be correct.
> >
> > One more rfkill interface will be generated for hci0 after hciattach, which can
> > be safely toggled block and unblock.
> >
> > However, if the GPIO is toggled down, the hciattach program will die.
> >
> > The bluetooth stack I used is fd.o's BlueZ.
> 
> I think the bigger issue is that the tty/serial subsystem does not have
> power sequencing support. Here we're trying to use rfkill to do that,
> but that doesn't seem to be what it was intended for. It might work with
> standalone USB bluetooth controllers that don't need any special setup,
> since the device will just appear and get registered. But it might not
> work so well with UART based adapters that need userspace fiddling with
> firmware and hciattach.

Then you can also have a look at the generic power sequence patches
that are floating around.

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

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

* Re: [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi
       [not found] <20161206080838.7523-1-icenowy@aosc.xyz>
@ 2016-12-09  8:07 ` Maxime Ripard
  0 siblings, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2016-12-09  8:07 UTC (permalink / raw)
  To: Icenowy Zheng
  Cc: Chen-Yu Tsai, Hans de Goede, devicetree, linux-arm-kernel, linux-kernel

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

On Tue, Dec 06, 2016 at 04:08:38PM +0800, Icenowy Zheng wrote:
> Some SDIO Wi-Fi chips (such as RTL8703AS) have a UART bluetooth, which
> has a dedicated enable pin (PL8 in the reference design).
> 
> Enable the pin in the same way as the WLAN enable pins.
> 
> Tested on an A33 Q8 tablet with RTL8703AS.
> 
> Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz>
> ---
> 
> This patch should be coupled with the uart1 node patch I send before:
> http://lists.infradead.org/pipermail/linux-arm-kernel/2016-December/471997.html
> 
> For RTL8703AS, the rtl8723bs bluetooth code is used, which can be retrieve from:
> https://github.com/lwfinger/rtl8723bs_bt
> 
>  arch/arm/boot/dts/sun8i-q8-common.dtsi | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/boot/dts/sun8i-q8-common.dtsi b/arch/arm/boot/dts/sun8i-q8-common.dtsi
> index c676940..4aeb5bb 100644
> --- a/arch/arm/boot/dts/sun8i-q8-common.dtsi
> +++ b/arch/arm/boot/dts/sun8i-q8-common.dtsi
> @@ -88,7 +88,7 @@
>  
>  &r_pio {
>  	wifi_pwrseq_pin_q8: wifi_pwrseq_pin@0 {
> -		pins = "PL6", "PL7", "PL11";
> +		pins = "PL6", "PL7", "PL8", "PL11";
>  		function = "gpio_in";
>  		bias-pull-up;
>  	};

There's several things wrong here. The first one is that you rely
solely on the pinctrl state to maintain a reset line. This is very
fragile (especially since the GPIO pinctrl state are likely to go away
at some point), but it also means that if your driver wants to recover
from that situation at some point, it won't work.

The other one is that the bluetooth and wifi chips are two devices in
linux, and you assign that pin to the wrong device (wifi).

rfkill-gpio is made just for that, so please use it.

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

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

end of thread, other threads:[~2016-12-20 13:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20161213233658.atGuNCNY@smtp1h.mail.yandex.net>
2016-12-16 12:47 ` [PATCH] ARM: dts: sun8i-q8-common: enable bluetooth on SDIO Wi-Fi Maxime Ripard
     [not found]   ` <4720181481899200@web7g.yandex.ru>
2016-12-19 10:09     ` Maxime Ripard
     [not found]       ` <11985541482156512@web2g.yandex.ru>
2016-12-19 14:24         ` Chen-Yu Tsai
2016-12-20 13:50           ` Maxime Ripard
     [not found] <20161206080838.7523-1-icenowy@aosc.xyz>
2016-12-09  8:07 ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).