Skip to contentSkip to conversation

ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

PATCH New christopher.spinrath at rwth-aachen.de 3 participants 7 messages May 30, 2017 – Jun 17, 2017 2 messages not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

From: Christopher Spinrath <[email protected]>

The cm-fx6 module has an on-board AW-NH387 WiFi/BT module which is based on Marvell's SD8787 chip and is connected to the usdhc1 controller.

Unfortunately, the chip gets unresponsive if the Bluetooth AMP (Alternate Mac/Phy) function gets probed but the loaded firmware doesn't support it. For instance, this is the case for the most recent firmware in linux-firmware (Version 14.66.35.p52).

Thus, just add the required nodes but leave the usdhc1 node disabled explicitly. Users who disabled the Bluetooth (AMP) support of their OS can then conveniently enable WiFi (or even plain Bluetooth) support with a simple device tree overlay/bootloader configuration.

---

Hi all,

some more information on the Bluetooth AMP dilemma: the vendor (CompuLab) just remove Bluetooth AMP support from the kernel. However, this is not an option here, since it would introduce a regression for its actual users.

Neither is degrading the firmware a good option: recent firmare (without AMP support) provides WiFi that is more stable (in particular, for access points).

I wrote a RFC to linux-bluetooth [1] two weeks ago about this problem and the only feedback I got was that Marvell has to provide information about how to detect whether the firmware supports AMP properly -- but this is unlikely given Marvell's information policy (in particular, since the sd8787 seems to be unsupported as of now).

IMHO this patch is currently the best option, since it allows users in a convenient way to enable WiFi support (e.g. no pinctrl handling in overlays), even when they are using distribution kernels/device trees. Furthermore, the hardware description is entirely accurate -- we have a driver/firmware problem here.

Thanks,
Christopher

[1] https://www.spinics.net/lists/linux-bluetooth/msg70493.html

 arch/arm/boot/dts/imx6q-cm-fx6.dts | 41 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
arch/arm/boot/dts/imx6q-cm-fx6.dts +41 -0
index a8af382..fe6ab0a 100644
@@ -64,6 +64,14 @@
 		};
 	};
 
+	awnh387_pwrseq: pwrseq {
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_pwrseq>;
+		compatible = "mmc-pwrseq-sd8787";
+		powerdown-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;
+	};
+
 	reg_pcie_power_on_gpio: regulator-pcie-power-on-gpio {
 		compatible = "regulator-fixed";
 		regulator-name = "regulator-pcie-power-on-gpio";
@@ -304,6 +312,13 @@
 		>;
 	};
 
+	pinctrl_pwrseq: pwrseqgrp {
+		fsl,pins = <
+			MX6QDL_PAD_GPIO_17__GPIO7_IO12		0x1b0b0
+			MX6QDL_PAD_NANDF_CS3__GPIO6_IO16	0x1b0b0
+		>;
+	};
+
 	pinctrl_spdif: spdifgrp {
 		fsl,pins = <
 			MX6QDL_PAD_GPIO_16__SPDIF_IN  0x1b0b0
@@ -330,6 +345,17 @@
 			MX6QDL_PAD_EIM_D22__GPIO3_IO22	0x130b0
 		>;
 	};
+
+	pinctrl_usdhc1: usdhc1grp {
+		fsl,pins = <
+			MX6QDL_PAD_SD1_CMD__SD1_CMD	0x17071
+			MX6QDL_PAD_SD1_CLK__SD1_CLK	0x10071
+			MX6QDL_PAD_SD1_DAT0__SD1_DATA0	0x17071
+			MX6QDL_PAD_SD1_DAT1__SD1_DATA1	0x17071
+			MX6QDL_PAD_SD1_DAT2__SD1_DATA2	0x17071
+			MX6QDL_PAD_SD1_DAT3__SD1_DATA3	0x17071
+		>;
+	};
 };
 
 &pcie {
@@ -382,3 +408,18 @@
 	dr_mode = "otg";
 	status = "okay";
 };
+
+&usdhc1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_usdhc1>;
+	mmc-pwrseq = <&awnh387_pwrseq>;
+	non-removable;
+	/*
+	 * If the OS probes the Bluetooth AMP function advertised on this bus
+	 * but the firmware in place does not support it, the WiFi/BT module
+	 * gets unresponsive.
+	 * Users who configured their OS properly can enable this node to gain
+	 * WiFi and/or plain Bluetooth support.
+	 */
+	status = "disabled";
+};
Signature · 1 line
2.10.2
reviewer
#1 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

Hi Christopher,

arch/arm/boot/dts/imx6q-cm-fx6.dts line 72

Quoted 6 lines · On Tue, May 30, 2017 at 5:16 PM, <[email protected]> wrote:
arch/arm/boot/dts/imx6q-cm-fx6.dts +6 -0
+       awnh387_pwrseq: pwrseq {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pwrseq>;
+               compatible = "mmc-pwrseq-sd8787";
+               powerdown-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;

At least in the AW-NH387 datasheet I found it says:

RESETn: Reset(active low at least 10ns)

Please double check the polarity in device tree.

A message that is not in the archive (sent off-list or not yet received): [email protected]

#3 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

Hi Fabio,

thanks for the fast reply.

Quoted 11 lines · Fabio Estevam

Hi Christopher,

arch/arm/boot/dts/imx6q-cm-fx6.dts line 72

Quoted 6 lines · On Tue, May 30, 2017 at 5:16 PM, <[email protected]> wrote:
arch/arm/boot/dts/imx6q-cm-fx6.dts +6 -0
+       awnh387_pwrseq: pwrseq {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pwrseq>;
+               compatible = "mmc-pwrseq-sd8787";
+               powerdown-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;
Quoted 3 lines

At least in the AW-NH387 datasheet I found it says:

RESETn: Reset(active low at least 10ns)

The BSP device tree uses an active-low regulator called nreset, too, but strangly it has a startup delay of 10ms while the powerdown-regulator "starts up" immediately.

(btw: the "regulator setup" is not able to handle resets correctly.)

It seems to me that the pwrseq-sd8787 uses inverted logic: it first sets the -- in our case -- active-high gpio to high, waits, and then enables the powerdown-gpio.

This coincides with the gpio being called "reset" in the pwrseq binding, neither "nreset" nor "RESETn" (beware the missing *n*ot).

Quoted 2 lines

Please double check the polarity in device tree.

I just double checked: high/high for powerdown/reset gpios is the only of the four possible combinations that works.

So, all in all, I think the polarity is correct (or either the pwrseq driver or hardware invertes the polarity for some reason).

Cheers,
Christopher

#4 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

In reply to christopher.spinrath at rwth-aachen.de
Quoted 34 lines · christopher.spinrath at rwth-aachen.de

From: Christopher Spinrath <[email protected]>

The cm-fx6 module has an on-board AW-NH387 WiFi/BT module which is based on Marvell's SD8787 chip and is connected to the usdhc1 controller.

Unfortunately, the chip gets unresponsive if the Bluetooth AMP (Alternate Mac/Phy) function gets probed but the loaded firmware doesn't support it. For instance, this is the case for the most recent firmware in linux-firmware (Version 14.66.35.p52).

Thus, just add the required nodes but leave the usdhc1 node disabled explicitly. Users who disabled the Bluetooth (AMP) support of their OS can then conveniently enable WiFi (or even plain Bluetooth) support with a simple device tree overlay/bootloader configuration.

---

Hi all,

some more information on the Bluetooth AMP dilemma: the vendor (CompuLab) just remove Bluetooth AMP support from the kernel. However, this is not an option here, since it would introduce a regression for its actual users.

Neither is degrading the firmware a good option: recent firmare (without AMP support) provides WiFi that is more stable (in particular, for access points).

I wrote a RFC to linux-bluetooth [1] two weeks ago about this problem and the only feedback I got was that Marvell has to provide information about how to detect whether the firmware supports AMP properly -- but this is unlikely given Marvell's information policy (in particular, since the sd8787 seems to be unsupported as of now).

Quoted 5 lines

IMHO this patch is currently the best option, since it allows users in a convenient way to enable WiFi support (e.g. no pinctrl handling in overlays), even when they are using distribution kernels/device trees. Furthermore, the hardware description is entirely accurate -- we have a driver/firmware problem here.

Hi Valentin, Igor,

Are you guys fine with the patch?

Shawn

Quoted 87 lines

Thanks,
Christopher

[1] https://www.spinics.net/lists/linux-bluetooth/msg70493.html

 arch/arm/boot/dts/imx6q-cm-fx6.dts | 41 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
arch/arm/boot/dts/imx6q-cm-fx6.dts +41 -0
index a8af382..fe6ab0a 100644
@@ -64,6 +64,14 @@
 		};
 	};
 
+	awnh387_pwrseq: pwrseq {
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_pwrseq>;
+		compatible = "mmc-pwrseq-sd8787";
+		powerdown-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;
+	};
+
 	reg_pcie_power_on_gpio: regulator-pcie-power-on-gpio {
 		compatible = "regulator-fixed";
 		regulator-name = "regulator-pcie-power-on-gpio";
@@ -304,6 +312,13 @@
 		>;
 	};
 
+	pinctrl_pwrseq: pwrseqgrp {
+		fsl,pins = <
+			MX6QDL_PAD_GPIO_17__GPIO7_IO12		0x1b0b0
+			MX6QDL_PAD_NANDF_CS3__GPIO6_IO16	0x1b0b0
+		>;
+	};
+
 	pinctrl_spdif: spdifgrp {
 		fsl,pins = <
 			MX6QDL_PAD_GPIO_16__SPDIF_IN  0x1b0b0
@@ -330,6 +345,17 @@
 			MX6QDL_PAD_EIM_D22__GPIO3_IO22	0x130b0
 		>;
 	};
+
+	pinctrl_usdhc1: usdhc1grp {
+		fsl,pins = <
+			MX6QDL_PAD_SD1_CMD__SD1_CMD	0x17071
+			MX6QDL_PAD_SD1_CLK__SD1_CLK	0x10071
+			MX6QDL_PAD_SD1_DAT0__SD1_DATA0	0x17071
+			MX6QDL_PAD_SD1_DAT1__SD1_DATA1	0x17071
+			MX6QDL_PAD_SD1_DAT2__SD1_DATA2	0x17071
+			MX6QDL_PAD_SD1_DAT3__SD1_DATA3	0x17071
+		>;
+	};
 };
 
 &pcie {
@@ -382,3 +408,18 @@
 	dr_mode = "otg";
 	status = "okay";
 };
+
+&usdhc1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_usdhc1>;
+	mmc-pwrseq = <&awnh387_pwrseq>;
+	non-removable;
+	/*
+	 * If the OS probes the Bluetooth AMP function advertised on this bus
+	 * but the firmware in place does not support it, the WiFi/BT module
+	 * gets unresponsive.
+	 * Users who configured their OS properly can enable this node to gain
+	 * WiFi and/or plain Bluetooth support.
+	 */
+	status = "disabled";
+};
Signature · 7 lines
2.10.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

A message that is not in the archive (sent off-list or not yet received): [email protected]

#6 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

Hi Shawn,

Quoted 41 lines · Shawn Guo
Quoted 34 lines · christopher.spinrath at rwth-aachen.de

From: Christopher Spinrath <[email protected]>

The cm-fx6 module has an on-board AW-NH387 WiFi/BT module which is based on Marvell's SD8787 chip and is connected to the usdhc1 controller.

Unfortunately, the chip gets unresponsive if the Bluetooth AMP (Alternate Mac/Phy) function gets probed but the loaded firmware doesn't support it. For instance, this is the case for the most recent firmware in linux-firmware (Version 14.66.35.p52).

Thus, just add the required nodes but leave the usdhc1 node disabled explicitly. Users who disabled the Bluetooth (AMP) support of their OS can then conveniently enable WiFi (or even plain Bluetooth) support with a simple device tree overlay/bootloader configuration.

---

Hi all,

some more information on the Bluetooth AMP dilemma: the vendor (CompuLab) just remove Bluetooth AMP support from the kernel. However, this is not an option here, since it would introduce a regression for its actual users.

Neither is degrading the firmware a good option: recent firmare (without AMP support) provides WiFi that is more stable (in particular, for access points).

I wrote a RFC to linux-bluetooth [1] two weeks ago about this problem and the only feedback I got was that Marvell has to provide information about how to detect whether the firmware supports AMP properly -- but this is unlikely given Marvell's information policy (in particular, since the sd8787 seems to be unsupported as of now).

Quoted 5 lines

IMHO this patch is currently the best option, since it allows users in a convenient way to enable WiFi support (e.g. no pinctrl handling in overlays), even when they are using distribution kernels/device trees. Furthermore, the hardware description is entirely accurate -- we have a driver/firmware problem here.

Quoted 3 lines

Hi Valentin, Igor,

Are you guys fine with the patch?

Do you have a specific question here?

The devicetree additions are mostly identical to their counterparts in the BSP devicetree. The only real exception being that the usdhc1 regulators have been replaced by the sd8787 power sequence, which allows the mmc core to reset the wifi/bt chip (which is not possible with the regulator setup). Note that the sd8787 power sequence binding/driver has only recently been added to Linux (v4.11) and is not present in the BSP kernel.

Furthermore, the Bluetooth AMP function is disabled in the BSP kernel by CompuLab [1] for the same reason we do not enable the usdhc1 node in this patch. (We cannot disable it in the driver because, as explained in the commit message, this would yield a regression.)

Thanks,
Christopher

[1]
https://github.com/utilite-computer/linux-kernel/commit/d2ef249cc37a61ec88bc0da0ffcc75799e12f25f.patch

Quoted 89 lines

Shawn

Quoted 87 lines

Thanks,
Christopher

[1] https://www.spinics.net/lists/linux-bluetooth/msg70493.html

 arch/arm/boot/dts/imx6q-cm-fx6.dts | 41 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
arch/arm/boot/dts/imx6q-cm-fx6.dts +41 -0
index a8af382..fe6ab0a 100644
@@ -64,6 +64,14 @@
 		};
 	};
 
+	awnh387_pwrseq: pwrseq {
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_pwrseq>;
+		compatible = "mmc-pwrseq-sd8787";
+		powerdown-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;
+	};
+
 	reg_pcie_power_on_gpio: regulator-pcie-power-on-gpio {
 		compatible = "regulator-fixed";
 		regulator-name = "regulator-pcie-power-on-gpio";
@@ -304,6 +312,13 @@
 		>;
 	};
 
+	pinctrl_pwrseq: pwrseqgrp {
+		fsl,pins = <
+			MX6QDL_PAD_GPIO_17__GPIO7_IO12		0x1b0b0
+			MX6QDL_PAD_NANDF_CS3__GPIO6_IO16	0x1b0b0
+		>;
+	};
+
 	pinctrl_spdif: spdifgrp {
 		fsl,pins = <
 			MX6QDL_PAD_GPIO_16__SPDIF_IN  0x1b0b0
@@ -330,6 +345,17 @@
 			MX6QDL_PAD_EIM_D22__GPIO3_IO22	0x130b0
 		>;
 	};
+
+	pinctrl_usdhc1: usdhc1grp {
+		fsl,pins = <
+			MX6QDL_PAD_SD1_CMD__SD1_CMD	0x17071
+			MX6QDL_PAD_SD1_CLK__SD1_CLK	0x10071
+			MX6QDL_PAD_SD1_DAT0__SD1_DATA0	0x17071
+			MX6QDL_PAD_SD1_DAT1__SD1_DATA1	0x17071
+			MX6QDL_PAD_SD1_DAT2__SD1_DATA2	0x17071
+			MX6QDL_PAD_SD1_DAT3__SD1_DATA3	0x17071
+		>;
+	};
 };
 
 &pcie {
@@ -382,3 +408,18 @@
 	dr_mode = "otg";
 	status = "okay";
 };
+
+&usdhc1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_usdhc1>;
+	mmc-pwrseq = <&awnh387_pwrseq>;
+	non-removable;
+	/*
+	 * If the OS probes the Bluetooth AMP function advertised on this bus
+	 * but the firmware in place does not support it, the WiFi/BT module
+	 * gets unresponsive.
+	 * Users who configured their OS properly can enable this node to gain
+	 * WiFi and/or plain Bluetooth support.
+	 */
+	status = "disabled";
+};
Signature · 7 lines
2.10.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
#7 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

Quoted 5 lines · Christopher Spinrath
Quoted 3 lines

Hi Valentin, Igor,

Are you guys fine with the patch?

Do you have a specific question here?

No, I don't. I just wanted to hear the voice of Compulab people. Okay, we haven't waited for time enough, so I just applied patch.

Quoted 9 lines

The devicetree additions are mostly identical to their counterparts in the BSP devicetree. The only real exception being that the usdhc1 regulators have been replaced by the sd8787 power sequence, which allows the mmc core to reset the wifi/bt chip (which is not possible with the regulator setup). Note that the sd8787 power sequence binding/driver has only recently been added to Linux (v4.11) and is not present in the BSP kernel.

Quoted 4 lines

Furthermore, the Bluetooth AMP function is disabled in the BSP kernel by CompuLab [1] for the same reason we do not enable the usdhc1 node in this patch. (We cannot disable it in the driver because, as explained in the commit message, this would yield a regression.)

Thanks for the comments.

Shawn

#8 lore raw

PATCH 1/1 ARM: dts: imx6q-cm-fx6: add sdio wifi/bt nodes

Quoted 9 lines · Shawn Guo
Quoted 5 lines · Christopher Spinrath
Quoted 3 lines

Hi Valentin, Igor,

Are you guys fine with the patch?

Do you have a specific question here?

No, I don't. I just wanted to hear the voice of Compulab people. Okay, we haven't waited for time enough, so I just applied patch.

s/haven't/have