[PATCH] arm64: dts: ti: k3-am625-beagleplay: Use pwrseq for TI's wl18xx enable.

From: Sukrut Bellary
Date: Wed Dec 13 2023 - 16:32:49 EST


BeaglePlay SBC has Texas Instrument's WL18xx WiFi Chipset.

BeaglePlay SBC:
https://www.beagleboard.org/boards/beagleplay

TI WL18XX:
https://www.ti.com/lit/ds/symlink/wl1807mod.pdf

Currently, WLAN_EN is configured as regulator and regulator-always-on.
During hibernation thaw, WiFi fails to come online.
During freeze/suspend,
the WLAN_EN line is not put to low '0' to power down the WiFi.
So during restore, the WiFi driver tries to load the FW without following
correct power sequence.
WLAN_EN => '1'/assert (high) to power-up the chipset.
WLAN_EN => '0'/deassert (low) to shut-down the chipset.

thaw failure log below:

Use mmc-pwrseq-simple to drive TI's WiFi (WL18xx) chipset enable 'WLAN_EN'.
mmc-pwrseq-simple provides power sequence flexibility with support for
post power-on and power-off delays.

================ thaw failure Log ================
[ 161.418528] ------------[ cut here ]------------
[ 161.418540] WARNING: CPU: 1 PID: 45 at drivers/net/wireless/ti/wlcore/sdio.c:123 wl12xx_sdio_raw_write+0xe4/0x168 [wlcore_sdio]
[ 161.418576] Modules linked in: br_netfilter bridge stp llc overlay usb_f_mass_storage usb_f_acm u_serial usb_f_ncm usb_f_rndis u_ether libcomposite wl18xx wlcore mac80211 libarc4 cfg80211 rfkill crct10dif_ce6[ 161.418676] CPU: 1 PID: 45 Comm: kworker/u8:2 Not tainted 6.5.0-rc6+ #2
[ 161.418684] Hardware name: BeagleBoard.org BeaglePlay (DT)
[ 161.418691] Workqueue: events_unbound async_run_entry_fn
[ 161.418711] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 161.418719] pc : wl12xx_sdio_raw_write+0xe4/0x168 [wlcore_sdio]
[ 161.418731] lr : wl12xx_sdio_raw_write+0x94/0x168 [wlcore_sdio]
[ 161.418743] sp : ffff800082b43970
[ 161.418746] x29: ffff800082b43970 x28: ffff800083c5b000 x27: 0000000000000003
[ 161.418757] x26: ffff80007aab3800 x25: ffff800083c53000 x24: 0000000000000000
[ 161.418767] x23: 0000000000004000 x22: ffff00000f938000 x21: ffff000005bd3010
[ 161.418778] x20: 0000000000008000 x19: ffff000005bd2000 x18: 0000000000000000
[ 161.418789] x17: 0000000000000100 x16: 0000000000000000 x15: f44fb9a9e0200014
[ 161.418799] x14: 0000000000000049 x13: 000000000000038f x12: 0000000000000000
[ 161.418809] x11: 0000000000000001 x10: 0000000000000a50 x9 : ffff800082b43550
[ 161.418819] x8 : ffff000000ca2830 x7 : ffff00007fb92f40 x6 : 00000007e5428bd2
[ 161.418829] x5 : 03ffffffffffffff x4 : ffff0000002569c0 x3 : 0000000000000000
[ 161.418839] x2 : 0000000000000001 x1 : ffff000000256810 x0 : 00000000ffffff92
[ 161.418850] Call trace:
[ 161.418856] wl12xx_sdio_raw_write+0xe4/0x168 [wlcore_sdio]
[ 161.418869] wlcore_raw_write.constprop.0+0x4c/0xac [wlcore]
[ 161.418931] wlcore_boot_upload_firmware+0x140/0x3c0 [wlcore]
[ 161.418973] wl18xx_boot+0x574/0x77c [wl18xx]
[ 161.419011] wl1271_op_add_interface+0x5f0/0xaa8 [wlcore]
[ 161.419052] drv_add_interface+0x3c/0x88 [mac80211]
[ 161.419228] ieee80211_reconfig+0x1a8/0xf1c [mac80211]
[ 161.419330] ieee80211_resume+0x54/0x70 [mac80211]
[ 161.419432] wiphy_resume+0x84/0xf8 [cfg80211]
[ 161.419562] device_resume+0x84/0x178
[ 161.419576] async_resume+0x28/0x74
[ 161.419584] async_run_entry_fn+0x34/0xe0
[ 161.419596] process_one_work+0x1e0/0x340
[ 161.419605] worker_thread+0x68/0x428
[ 161.419613] kthread+0x114/0x118
[ 161.419620] ret_from_fork+0x10/0x20
[ 161.419630] ---[ end trace 0000000000000000 ]---
[ 161.419726] wl1271_sdio mmc2:0001:2: sdio write failed (-110)
[ 162.341981] wlcore: using inverted interrupt logic: 2
[ 170.553515] ------------[ cut here ]------------

[ 180.315942] ieee80211 phy0: PM: dpm_run_callback(): wiphy_resume+0x0/0xf8 [cfg80211] returns -110
[ 180.316090] ieee80211 phy0: PM: failed to thaw async: error -110
======================================================

Full thaw failure log -
https://gist.github.com/sukrutb/8b02a9ffa7bd1cb9fb514220e9af097e

Suggested-by: Shengyu Qu <wiagn233@xxxxxxxxxxx>
Signed-off-by: Sukrut Bellary <sukrut.bellary@xxxxxxxxx>
---
.../arm64/boot/dts/ti/k3-am625-beagleplay.dts | 25 ++++++++-----------
1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts b/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts
index eadbdd9ffe37..d388c5e78658 100644
--- a/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts
+++ b/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts
@@ -83,6 +83,15 @@ wkup_r5fss0_core0_dma_memory_region: r5f-dma-memory@9db00000 {
};
};

+ sdio_pwrseq: sdio-pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ pinctrl-names = "default";
+ pinctrl-0 = <&wifi_en_pins_default>;
+ post-power-on-delay-ms = <1>;
+ power-off-delay-us = <80>;
+ reset-gpios = <&main_gpio0 38 GPIO_ACTIVE_LOW>;
+ };
+
vsys_5v0: regulator-1 {
bootph-all;
compatible = "regulator-fixed";
@@ -105,20 +114,6 @@ vdd_3v3: regulator-2 {
regulator-boot-on;
};

- wlan_en: regulator-3 {
- /* OUTPUT of SN74AVC2T244DQMR */
- compatible = "regulator-fixed";
- regulator-name = "wlan_en";
- regulator-min-microvolt = <1800000>;
- regulator-max-microvolt = <1800000>;
- enable-active-high;
- regulator-always-on;
- vin-supply = <&vdd_3v3>;
- gpio = <&main_gpio0 38 GPIO_ACTIVE_HIGH>;
- pinctrl-names = "default";
- pinctrl-0 = <&wifi_en_pins_default>;
- };
-
vdd_3v3_sd: regulator-4 {
/* output of TPS22918DBVR-U21 */
bootph-all;
@@ -849,7 +844,6 @@ &sdhci1 {
};

&sdhci2 {
- vmmc-supply = <&wlan_en>;
pinctrl-names = "default";
pinctrl-0 = <&wifi_pins_default>, <&wifi_32k_clk>;
bus-width = <4>;
@@ -857,6 +851,7 @@ &sdhci2 {
ti,fails-without-test-cd;
cap-power-off-card;
keep-power-in-suspend;
+ mmc-pwrseq = <&sdio_pwrseq>;
ti,driver-strength-ohm = <50>;
assigned-clocks = <&k3_clks 157 158>;
assigned-clock-parents = <&k3_clks 157 160>;
--
2.34.1