Re: Port SDIO GPIO to DTS
From: Dmitry Osipenko <hidden>
Date: 2018-01-18 00:38:20
Possibly related (same subject, not in this thread)
- 2018-02-03 · Re: Port SDIO GPIO to DTS · Dmitry Osipenko <hidden>
- 2018-02-02 · Re: Port SDIO GPIO to DTS · Kyle Evans <hidden>
- 2018-01-31 · Re: Port SDIO GPIO to DTS · Dmitry Osipenko <hidden>
- 2018-01-30 · Re: Port SDIO GPIO to DTS · Kyle Evans <hidden>
- 2018-01-17 · Port SDIO GPIO to DTS · Kyle Evans <hidden>
Hello Kyle, On 18.01.2018 01:13, Kyle Evans wrote:
I have an ASUS TF101(ventana) that I am trying to get running on
mainline. It is mostly there, but there are a few issues that I believe
to be dts related. I am focusing on one at a time. Currently, when I
warm boot/reboot, the wireless SDIO device fails to initialize. It
works great on cold boot. I'm fairly certain the problem is in the
dts, but I'd like some feedback on the correct way.
From a working, pre-dts kernel I have stuff like this.
arch/arm/mach-tegra/board-tf101-sdhci.c:
...
#define TF101_WLAN_RST TEGRA_GPIO_PK6
#define TF101_WLAN_WOW TEGRA_GPIO_PS0
#define TF101_SDIO_WOW TEGRA_GPIO_PY6
...
static struct embedded_sdio_data embedded_sdio_data1 = {
.cccr = {
.sdio_vsn = 2,
.multi_block = 1,
.low_speed = 0,
.wide_bus = 0,
.high_power = 1,
.high_speed = 1,
},
.cis = {
.vendor = 0x02d0,
.device = 0x4329,
},
static struct tegra_sdhci_platform_data tegra_sdhci_platform_data1 = {
.mmc_data = {
.register_status_notify = tf101_wifi_status_register,
.embedded_sdio = &embedded_sdio_data1,
.built_in = 0,
},
.wow_gpio = TF101_SDIO_WOW,
.cd_gpio = -1,
.wp_gpio = -1,
.power_gpio = -1,
.max_clk_limit = 40000000,
};
...
static int tf101_wifi_power(int on)
{
pr_debug("%s: %d\n", __func__, on);
#if 0
gpio_set_value(TF101_WLAN_PWR, on);
mdelay(100);
#endif
gpio_set_value(TF101_WLAN_RST, on);
mdelay(200);
return 0;
}
static int tf101_wifi_reset(int on)
{
pr_debug("%s: do nothing\n", __func__);
return 0;
}
static int __init tf101_wifi_init(void)
{
//gpio_request(TF101_WLAN_PWR, "wlan_power");
gpio_request(TF101_WLAN_RST, "wlan_rst");
gpio_request(TF101_WLAN_WOW, "bcmsdh_sdmmc");
//tegra_gpio_enable(TF101_WLAN_PWR);
tegra_gpio_enable(TF101_WLAN_RST);
tegra_gpio_enable(TF101_WLAN_WOW);
//gpio_direction_output(TF101_WLAN_PWR, 0);
gpio_direction_output(TF101_WLAN_RST, 0);
gpio_direction_input(TF101_WLAN_WOW);
platform_device_register(&tf101_wifi_device);
device_init_wakeup(&tf101_wifi_device.dev, 1);
device_set_wakeup_enable(&tf101_wifi_device.dev, 0);
return 0;
}
...
It looks like I have three GPIO lines dealing with mmc0/wlan. Can I
assume WOW is Wireless pOWer?WoW should stand for Wake on Wireless [0]. You could ping your TF101 while it is suspended and it will wake up. [0] https://wireless.wiki.kernel.org/en/users/documentation/wowlan
I'm not sure of the difference between WLAN_WOW & SDIO_WOW. I'm
assuming one for chip, one for radio, but I don't know their place in
the dts.
From tegra20-ventana.dts I've got:
sdhci@c8000000 {
status = "okay";
power-gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
bus-width = <4>;
keep-power-in-suspend;
};
I'm guessing I need to add the other pins to power-gpois and
set up mmc-pwrseq?The 'power-gpois' that you've defined looks fine and probably sufficient to get WiFi up and running. Take a look at the changes that were needed to get WiFi working on Acer A500, maybe some of it also applicable to TF101: https://github.com/digetx/picasso_upstream_support/commit/beab29d4f172836c5faad91d3232a7c77c5fc6fb https://github.com/digetx/picasso_upstream_support/commit/165e488e82c97fa1da6ccfe832a43569136000bc https://github.com/digetx/picasso_upstream_support/commit/7e584ca4108707c6469a04bf92d9b659ce76c5cc https://github.com/digetx/picasso_upstream_support/commit/4f0d7ac43592826e03f766005a3720ecc5ad1476#diff-4ce775d33b1aadd3981ea13ea140eca6R702 Also note that (at least on A500) BCM chip also provides Bluetooth and the 'power/rst' GPIO affects both Wifi and Bluetooth.