aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/staging/wfx/main.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2020-07-03 15:07:56 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-07-10 13:51:22 +0200
commit354d6ca9d99790e037bf06f093634e851d1253ee (patch)
tree39fc0832670f74a1970a9ccd522f44147a275d85 /drivers/staging/wfx/main.c
parentstaging: wfx: fix uninitialized variable bytes_done (diff)
downloadwireguard-linux-354d6ca9d99790e037bf06f093634e851d1253ee.tar.xz
wireguard-linux-354d6ca9d99790e037bf06f093634e851d1253ee.zip
staging: wfx: Get descriptors for GPIOs
The code has the functionality to insert the GPIO lines using the global GPIO numbers through module parameters. As we are clearly deprecating the use of global GPIO numbers look up the GPIO descriptors from the device instead. This usually falls back to device hardware descriptions using e.g. device tree or ACPI. This device clearly supports device tree when used over SPI for example. For example, this can be supplied in the device tree like so: wfx@0x01 { compatible = "silabs,wf200"; reset-gpios = <&gpio0 1>; wakeup-gpios = <&gpio0 2>; }; Cc: Jérôme Pouiller <jerome.pouiller@silabs.com> Reviewed-by: Jérôme Pouiller <jerome.pouiller@silabs.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20200703130756.514868-1-linus.walleij@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/wfx/main.c')
-rw-r--r--drivers/staging/wfx/main.c47
1 files changed, 7 insertions, 40 deletions
diff --git a/drivers/staging/wfx/main.c b/drivers/staging/wfx/main.c
index 62e3634556ec..11dfa088fc86 100644
--- a/drivers/staging/wfx/main.c
+++ b/drivers/staging/wfx/main.c
@@ -13,7 +13,6 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_net.h>
-#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/mmc/sdio_func.h>
#include <linux/spi/spi.h>
@@ -41,10 +40,6 @@ MODULE_DESCRIPTION("Silicon Labs 802.11 Wireless LAN driver for WFx");
MODULE_AUTHOR("Jérôme Pouiller <jerome.pouiller@silabs.com>");
MODULE_LICENSE("GPL");
-static int gpio_wakeup = -2;
-module_param(gpio_wakeup, int, 0644);
-MODULE_PARM_DESC(gpio_wakeup, "gpio number for wakeup. -1 for none.");
-
#define RATETAB_ENT(_rate, _rateid, _flags) { \
.bitrate = (_rate), \
.hw_value = (_rateid), \
@@ -170,38 +165,6 @@ bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor)
return false;
}
-struct gpio_desc *wfx_get_gpio(struct device *dev,
- int override, const char *label)
-{
- struct gpio_desc *ret;
- char label_buf[256];
-
- if (override >= 0) {
- snprintf(label_buf, sizeof(label_buf), "wfx_%s", label);
- ret = ERR_PTR(devm_gpio_request_one(dev, override,
- GPIOF_OUT_INIT_LOW,
- label_buf));
- if (!ret)
- ret = gpio_to_desc(override);
- } else if (override == -1) {
- ret = NULL;
- } else {
- ret = devm_gpiod_get(dev, label, GPIOD_OUT_LOW);
- }
- if (IS_ERR_OR_NULL(ret)) {
- if (!ret || PTR_ERR(ret) == -ENOENT)
- dev_warn(dev, "gpio %s is not defined\n", label);
- else
- dev_warn(dev, "error while requesting gpio %s\n",
- label);
- ret = NULL;
- } else {
- dev_dbg(dev, "using gpio %d for %s\n",
- desc_to_gpio(ret), label);
- }
- return ret;
-}
-
/* NOTE: wfx_send_pds() destroy buf */
int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len)
{
@@ -340,7 +303,12 @@ struct wfx_dev *wfx_init_common(struct device *dev,
memcpy(&wdev->pdata, pdata, sizeof(*pdata));
of_property_read_string(dev->of_node, "config-file",
&wdev->pdata.file_pds);
- wdev->pdata.gpio_wakeup = wfx_get_gpio(dev, gpio_wakeup, "wakeup");
+ wdev->pdata.gpio_wakeup = devm_gpiod_get_optional(dev, "wakeup",
+ GPIOD_OUT_LOW);
+ if (IS_ERR(wdev->pdata.gpio_wakeup))
+ return ERR_CAST(wdev->pdata.gpio_wakeup);
+ if (wdev->pdata.gpio_wakeup)
+ gpiod_set_consumer_name(wdev->pdata.gpio_wakeup, "wfx wakeup");
wfx_sl_fill_pdata(dev, &wdev->pdata);
mutex_init(&wdev->conf_mutex);
@@ -444,8 +412,7 @@ int wfx_probe(struct wfx_dev *wdev)
wdev->pdata.gpio_wakeup = gpio_saved;
if (wdev->pdata.gpio_wakeup) {
dev_dbg(wdev->dev,
- "enable 'quiescent' power mode with gpio %d and PDS file %s\n",
- desc_to_gpio(wdev->pdata.gpio_wakeup),
+ "enable 'quiescent' power mode with wakeup GPIO and PDS file %s\n",
wdev->pdata.file_pds);
gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 1);
control_reg_write(wdev, 0);