367 lines
11 KiB
Diff
367 lines
11 KiB
Diff
|
From bda1ac49ca200db73088257adc9b9a2742f2df7f Mon Sep 17 00:00:00 2001
|
||
|
From: Ondrej Jirman <megi@xff.cz>
|
||
|
Date: Sat, 29 Jul 2023 23:30:19 +0200
|
||
|
Subject: [PATCH 408/464] bes2600: Use device tree exclusively for platform
|
||
|
data
|
||
|
|
||
|
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||
|
---
|
||
|
drivers/staging/bes2600/bes2600_plat.h | 8 +-
|
||
|
drivers/staging/bes2600/bes2600_sdio.c | 240 +++++--------------------
|
||
|
2 files changed, 51 insertions(+), 197 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/staging/bes2600/bes2600_plat.h b/drivers/staging/bes2600/bes2600_plat.h
|
||
|
index 5838435b9315..aaec3b9e1c99 100644
|
||
|
--- a/drivers/staging/bes2600/bes2600_plat.h
|
||
|
+++ b/drivers/staging/bes2600/bes2600_plat.h
|
||
|
@@ -33,10 +33,10 @@ struct bes2600_platform_data_sdio {
|
||
|
/* All others are optional */
|
||
|
bool have_5ghz;
|
||
|
bool no_nptb; /* SDIO hardware does not support non-power-of-2-blocksizes */
|
||
|
- int reset; /* GPIO to RSTn signal (0 disables) */
|
||
|
- int powerup; /* GPIO to POWERUP signal (0 disables) */
|
||
|
- int wakeup; /* GPIO to WAKEUP signal (0 disables) */
|
||
|
- int host_wakeup; /* wifi GPIO to WAKEUP host signal (0 disables) */
|
||
|
+ struct gpio_desc *reset; /* GPIO to RSTn signal (0 disables) */
|
||
|
+ struct gpio_desc *powerup; /* GPIO to POWERUP signal (0 disables) */
|
||
|
+ struct gpio_desc *wakeup; /* GPIO to WAKEUP signal (0 disables) */
|
||
|
+ struct gpio_desc *host_wakeup; /* wifi GPIO to WAKEUP host signal (0 disables) */
|
||
|
bool wlan_bt_hostwake_registered;/* wifi request_irq success or not */
|
||
|
int gpio_irq; /* IRQ line or 0 to use SDIO IRQ */
|
||
|
int (*power_ctrl)(const struct bes2600_platform_data_sdio *pdata,
|
||
|
diff --git a/drivers/staging/bes2600/bes2600_sdio.c b/drivers/staging/bes2600/bes2600_sdio.c
|
||
|
index d9b60c72fd45..83a1d7a7eebc 100644
|
||
|
--- a/drivers/staging/bes2600/bes2600_sdio.c
|
||
|
+++ b/drivers/staging/bes2600/bes2600_sdio.c
|
||
|
@@ -606,33 +606,9 @@ static int bes2600_sdio_off(const struct bes2600_platform_data_sdio *pdata)
|
||
|
{
|
||
|
bes2600_info(BES2600_DBG_SDIO, "%s enter\n", __func__);
|
||
|
|
||
|
-#if defined(PLAT_ALLWINNER)
|
||
|
- sunxi_wlan_set_power(false);
|
||
|
-#endif
|
||
|
-
|
||
|
-#if defined(PLAT_ROCKCHIP)
|
||
|
- rockchip_wifi_set_carddetect(0);
|
||
|
- rockchip_wifi_power(0);
|
||
|
-#endif
|
||
|
-
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_direction_output(pdata->powerup, 0);
|
||
|
- }
|
||
|
-
|
||
|
- if (gpio_is_valid(pdata->reset)) {
|
||
|
- gpio_direction_output(pdata->reset, 0);
|
||
|
- }
|
||
|
-#endif
|
||
|
-
|
||
|
- if (pdata == NULL)
|
||
|
- return 0;
|
||
|
+ gpiod_direction_output(pdata->powerup, 0);
|
||
|
|
||
|
-#ifdef BES2600_INDEPENDENT_EVB
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_direction_output(pdata->powerup, 0);
|
||
|
- }
|
||
|
-#endif
|
||
|
+ gpiod_direction_output(pdata->reset, 0);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -642,36 +618,13 @@ static int bes2600_sdio_on(const struct bes2600_platform_data_sdio *pdata)
|
||
|
|
||
|
bes2600_info(BES2600_DBG_SDIO, "%s enter\n", __func__);
|
||
|
|
||
|
-#if defined(PLAT_ALLWINNER)
|
||
|
- sunxi_wlan_set_power(true);
|
||
|
-#endif
|
||
|
-
|
||
|
-#ifdef PLAT_ROCKCHIP
|
||
|
- rockchip_wifi_power(0);
|
||
|
- rockchip_wifi_power(1);
|
||
|
- bes2600_chrdev_start_bus_probe();
|
||
|
- rockchip_wifi_set_carddetect(1);
|
||
|
-#endif
|
||
|
-
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_direction_output(pdata->powerup, 1);
|
||
|
- }
|
||
|
+ gpiod_direction_output(pdata->powerup, 1);
|
||
|
|
||
|
msleep(10);
|
||
|
- if (gpio_is_valid(pdata->reset)) {
|
||
|
- gpio_direction_output(pdata->reset, 0);
|
||
|
- }
|
||
|
- cvi_sdio_rescan();
|
||
|
-#endif
|
||
|
|
||
|
- if (pdata != NULL) {
|
||
|
-#ifdef BES2600_INDEPENDENT_EVB
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_direction_output(pdata->powerup, 1);
|
||
|
- }
|
||
|
-#endif
|
||
|
- }
|
||
|
+ gpiod_direction_output(pdata->reset, 0);
|
||
|
+
|
||
|
+ bes2600_chrdev_start_bus_probe();
|
||
|
|
||
|
#if defined(BES2600_BOOT_UART_TO_SDIO)
|
||
|
return bes2600_boot_uart_to_sdio(&bes2600_sdio_sbus_ops);
|
||
|
@@ -1405,151 +1358,63 @@ static int bes2600_sdio_misc_init(struct sbus_priv *self, struct bes2600_common
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-#if defined(PLAT_ALLWINNER)|| defined (PLAT_ROCKCHIP) || defined(PLAT_CVITEK_182X)
|
||
|
static struct bes2600_platform_data_sdio bes_sdio_plat_data = {
|
||
|
-#if defined(BES2600_INDEPENDENT_EVB)
|
||
|
- .reset = GPIOA(9),
|
||
|
- .powerup = GPIOC(3),
|
||
|
- .wakeup = -1,
|
||
|
-#elif defined(BES2600_INTEGRATED_MODULE_V1)
|
||
|
- .reset = GPIOA(0),
|
||
|
- .powerup = -1,
|
||
|
- .wakeup = -1,
|
||
|
-#elif defined(BES2600_INTEGRATED_MODULE_V2)
|
||
|
- .reset = GPIOM(2),
|
||
|
- .powerup = -1,
|
||
|
- .wakeup = GPIOM(5),
|
||
|
-#elif defined(PLAT_ROCKCHIP)
|
||
|
- .reset = -1,
|
||
|
- .powerup = -1,
|
||
|
- .wakeup = -1,
|
||
|
-#elif defined(PLAT_CVITEK_182X)
|
||
|
- .reset = -1,
|
||
|
- .powerup = -1,
|
||
|
- .wakeup = -1,
|
||
|
- .host_wakeup = -1,
|
||
|
-#endif
|
||
|
};
|
||
|
-#endif
|
||
|
|
||
|
struct bes2600_platform_data_sdio *bes2600_get_platform_data(void)
|
||
|
{
|
||
|
-#if defined(PLAT_ALLWINNER)|| defined (PLAT_ROCKCHIP) || defined(PLAT_CVITEK_182X)
|
||
|
return &bes_sdio_plat_data;
|
||
|
-#else
|
||
|
- return NULL;
|
||
|
-#endif
|
||
|
-}
|
||
|
-
|
||
|
-
|
||
|
-static void __attribute__((unused)) bes2600_get_gpio_from_dts(int *gpio_num, const char *gpio_name)
|
||
|
-{
|
||
|
- int wakeup_gpio;
|
||
|
- // enum of_gpio_flags flags;
|
||
|
- struct device_node *wireless_node;
|
||
|
- wireless_node = of_find_node_with_property(NULL, gpio_name);
|
||
|
- if(wireless_node != NULL){
|
||
|
- // wakeup_gpio = of_get_named_gpio_flags(wireless_node, gpio_name, 0, &flags);
|
||
|
- wakeup_gpio = of_get_named_gpio(wireless_node, gpio_name, 0);
|
||
|
- if (gpio_is_valid(wakeup_gpio))
|
||
|
- *gpio_num = wakeup_gpio;
|
||
|
- }else{
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "find node for %s failed\n", gpio_name);
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
-
|
||
|
static int bes2600_platform_data_init(void)
|
||
|
{
|
||
|
- int ret = 0;
|
||
|
struct bes2600_platform_data_sdio *pdata = bes2600_get_platform_data();
|
||
|
- if (pdata == NULL)
|
||
|
- return 0;
|
||
|
+ struct device_node *np;
|
||
|
+ int ret = 0;
|
||
|
|
||
|
- /* Ensure I/Os are pulled low */
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
- pdata->reset=cvi_get_wifi_reset_gpio();
|
||
|
-#endif
|
||
|
- if (gpio_is_valid(pdata->reset)) {
|
||
|
- ret = gpio_request(pdata->reset, "bes2600_wlan_reset");
|
||
|
- if (ret) {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "can't reqest reset_gpio:%d\n", ret);
|
||
|
- goto exit;
|
||
|
- } else {
|
||
|
- gpio_direction_output(pdata->reset, 0);
|
||
|
- }
|
||
|
- } else {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "reset is invalid\n");
|
||
|
+ np = of_find_compatible_node(NULL, NULL, "bestechnic,bes2600");
|
||
|
+ if (!np) {
|
||
|
+ pr_err("bestechnic,bes2600 device node found!\n");
|
||
|
+ return -ENODEV;
|
||
|
}
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
- pdata->powerup=cvi_get_wifi_pwr_on_gpio();
|
||
|
-#endif
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- ret = gpio_request(pdata->powerup, "bes2600_wlan_powerup");
|
||
|
- if (ret) {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "can't request powerup_gpio:%d\n", ret);
|
||
|
- goto exit;
|
||
|
- } else {
|
||
|
- gpio_direction_output(pdata->powerup, 0);
|
||
|
- }
|
||
|
- } else {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "powerup is invalid\n");
|
||
|
+
|
||
|
+ pdata->reset = fwnode_gpiod_get_index(&np->fwnode, "reset", 0, GPIOD_OUT_HIGH, "bes2600-reset");
|
||
|
+ if (IS_ERR(pdata->reset)) {
|
||
|
+ bes2600_err(BES2600_DBG_SDIO, "Can't request reset gpio (%ld)\n", PTR_ERR(pdata->reset));
|
||
|
+ pdata->reset = NULL;
|
||
|
}
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
- pdata->wakeup=cvi_get_wifi_wakeup_gpio();
|
||
|
-#else
|
||
|
- bes2600_get_gpio_from_dts(&pdata->wakeup, "WIFI,host_wakeup_wifi");
|
||
|
-#endif
|
||
|
- if (gpio_is_valid(pdata->wakeup)) {
|
||
|
- ret = gpio_request(pdata->wakeup, "bes2600_wakeup");
|
||
|
- if (ret) {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "can't request wakeup_gpio:%d\n", ret);
|
||
|
- goto exit;
|
||
|
- } else {
|
||
|
- gpio_direction_output(pdata->wakeup, 0);
|
||
|
- }
|
||
|
- } else {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "wakeup is invalid\n");
|
||
|
+
|
||
|
+ pdata->powerup = fwnode_gpiod_get_index(&np->fwnode, "powerup", 0, GPIOD_OUT_LOW, "bes2600-powerup");
|
||
|
+ if (IS_ERR(pdata->powerup)) {
|
||
|
+ bes2600_err(BES2600_DBG_SDIO, "Can't request powerup gpio (%ld)\n", PTR_ERR(pdata->powerup));
|
||
|
+ pdata->powerup = NULL;
|
||
|
}
|
||
|
-#ifndef PLAT_CVITEK_182X
|
||
|
- bes2600_get_gpio_from_dts(&pdata->host_wakeup, "WIFI,host_wake_irq");
|
||
|
-#endif
|
||
|
- if (gpio_is_valid(pdata->host_wakeup)) {
|
||
|
- ret = gpio_request(pdata->host_wakeup, "bes2600_host_irq");
|
||
|
- if (ret) {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "can't reqest host_wake_gpio:%d\n", ret);
|
||
|
- goto exit;
|
||
|
- } else {
|
||
|
- gpio_direction_input(pdata->host_wakeup);
|
||
|
- }
|
||
|
- } else {
|
||
|
- bes2600_err(BES2600_DBG_SDIO, "host_wakeup is invalid\n");
|
||
|
+
|
||
|
+ pdata->wakeup = fwnode_gpiod_get_index(&np->fwnode, "device-wakeup", 0, GPIOD_OUT_LOW, "bes2600-device-wakeup");
|
||
|
+ if (IS_ERR(pdata->wakeup)) {
|
||
|
+ bes2600_err(BES2600_DBG_SDIO, "Can't request device wakeup gpio (%ld)\n", PTR_ERR(pdata->wakeup));
|
||
|
+ pdata->wakeup = NULL;
|
||
|
}
|
||
|
|
||
|
- pdata->wlan_bt_hostwake_registered = false;
|
||
|
-exit:
|
||
|
+ pdata->host_wakeup = fwnode_gpiod_get_index(&np->fwnode, "host-wakeup", 0, GPIOD_IN, "bes2600-host-wakeup");
|
||
|
+ if (IS_ERR(pdata->host_wakeup)) {
|
||
|
+ bes2600_err(BES2600_DBG_SDIO, "Can't request host wakeup gpio (%ld)\n", PTR_ERR(pdata->host_wakeup));
|
||
|
+ pdata->host_wakeup = NULL;
|
||
|
+ }
|
||
|
+
|
||
|
+ of_node_put(np);
|
||
|
+
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static void bes2600_platform_data_deinit(void)
|
||
|
{
|
||
|
const struct bes2600_platform_data_sdio *pdata = bes2600_get_platform_data();
|
||
|
- if (pdata == NULL) {
|
||
|
- return;
|
||
|
- }
|
||
|
|
||
|
- if (gpio_is_valid(pdata->reset)) {
|
||
|
- gpio_free(pdata->reset);
|
||
|
- }
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_free(pdata->powerup);
|
||
|
- }
|
||
|
- if (gpio_is_valid(pdata->wakeup)) {
|
||
|
- gpio_free(pdata->wakeup);
|
||
|
- }
|
||
|
- if (gpio_is_valid(pdata->host_wakeup)) {
|
||
|
- gpio_free(pdata->host_wakeup);
|
||
|
- }
|
||
|
+ gpiod_put(pdata->reset);
|
||
|
+ gpiod_put(pdata->powerup);
|
||
|
+ gpiod_put(pdata->wakeup);
|
||
|
+ gpiod_put(pdata->host_wakeup);
|
||
|
}
|
||
|
|
||
|
static int bes2600_sdio_reset(struct sbus_priv *self)
|
||
|
@@ -1562,10 +1427,11 @@ static int bes2600_sdio_reset(struct sbus_priv *self)
|
||
|
return 0;
|
||
|
|
||
|
if (plat_data->reset) {
|
||
|
- gpio_set_value(plat_data->reset, 1);
|
||
|
+ gpiod_set_value(plat_data->reset, 1);
|
||
|
mdelay(50);
|
||
|
- gpio_set_value(plat_data->reset, 0);
|
||
|
+ gpiod_set_value(plat_data->reset, 0);
|
||
|
}
|
||
|
+
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -1623,8 +1489,8 @@ static void bes2600_gpio_wakeup_mcu(struct sbus_priv *self, int flag)
|
||
|
/* do wakeup mcu operation */
|
||
|
if(gpio_wakeup) {
|
||
|
bes2600_dbg(BES2600_DBG_SDIO, "pull high gpio by flag:%d\n", flag);
|
||
|
- if (gpio_is_valid(pdata->wakeup)) {
|
||
|
- gpio_set_value(pdata->wakeup, 1);
|
||
|
+ if (pdata->wakeup) {
|
||
|
+ gpiod_set_value(pdata->wakeup, 1);
|
||
|
msleep(10);
|
||
|
} else {
|
||
|
bes2600_err(BES2600_DBG_SDIO,
|
||
|
@@ -1666,8 +1532,8 @@ static void bes2600_gpio_allow_mcu_sleep(struct sbus_priv *self, int flag)
|
||
|
/* do wakeup mcu operation */
|
||
|
if(gpio_sleep) {
|
||
|
bes2600_dbg(BES2600_DBG_SDIO, "pull low gpio by flag:%d\n", flag);
|
||
|
- if (gpio_is_valid(pdata->wakeup)) {
|
||
|
- gpio_set_value(pdata->wakeup, 0);
|
||
|
+ if (pdata->wakeup) {
|
||
|
+ gpiod_set_value(pdata->wakeup, 0);
|
||
|
} else {
|
||
|
bes2600_err(BES2600_DBG_SDIO,
|
||
|
"%s, wakeup gpio is invalid\n", __func__);
|
||
|
@@ -2010,28 +1876,16 @@ static void bes2600_sdio_power_down(struct sbus_priv *self)
|
||
|
sdio_writeb(self->func, tmp_val, BES_HOST_INT_REG_ID, &ret);
|
||
|
sdio_release_host(self->func);
|
||
|
#else
|
||
|
-#if defined(PLAT_ROCKCHIP)
|
||
|
- rockchip_wifi_power(0);
|
||
|
-#endif
|
||
|
|
||
|
-#if defined(PLAT_ALLWINNER)
|
||
|
- sunxi_wlan_set_power(false);
|
||
|
-#endif
|
||
|
-
|
||
|
-#ifdef PLAT_CVITEK_182X
|
||
|
struct bes2600_platform_data_sdio *pdata = bes2600_get_platform_data();
|
||
|
|
||
|
- if (gpio_is_valid(pdata->powerup)) {
|
||
|
- gpio_direction_output(pdata->powerup, 0);
|
||
|
- }
|
||
|
-#endif
|
||
|
+ gpiod_direction_output(pdata->powerup, 0);
|
||
|
#endif
|
||
|
|
||
|
msleep(10);
|
||
|
|
||
|
self->func->card->host->caps &= ~MMC_CAP_NONREMOVABLE;
|
||
|
schedule_work(&self->sdio_scan_work);
|
||
|
-
|
||
|
}
|
||
|
|
||
|
static int bes2600_sdio_power_switch(struct sbus_priv *self, int on)
|
||
|
--
|
||
|
2.34.1
|
||
|
|