[PATCH v3] staging: wfx: Get descriptors for GPIOs

Jérôme Pouiller jerome.pouiller at silabs.com
Mon Jun 29 10:35:01 UTC 2020


On Sunday 28 June 2020 10:52:36 CEST Linus Walleij wrote:
> 
> 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 at 0x01 {
>       compatible = "silabs,wf200";
>       reset-gpios = <&gpio0 1>;
>       wakeup-gpios = <&gpio0 2>;
>   };
>
> Cc: Jérôme Pouiller <jerome.pouiller at silabs.com>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> ChangeLog v2->v3:
> - ERR_CAST not PTR_CAST
> ChangeLog v1->v2:
> - Fixed a cast and a variable name.
> - I still don't know how to compile this but hey the zeroday
>   robot does.
> ---
>  drivers/staging/wfx/bus_spi.c | 11 +++++----
>  drivers/staging/wfx/main.c    | 42 ++++-------------------------------
>  drivers/staging/wfx/main.h    |  2 --
>  3 files changed, 9 insertions(+), 46 deletions(-)
> 
> diff --git a/drivers/staging/wfx/bus_spi.c b/drivers/staging/wfx/bus_spi.c
> index e8da61fb096b..88ca5d453e83 100644
> --- a/drivers/staging/wfx/bus_spi.c
> +++ b/drivers/staging/wfx/bus_spi.c
> @@ -8,7 +8,6 @@
>   */
>  #include <linux/module.h>
>  #include <linux/delay.h>
> -#include <linux/gpio.h>
>  #include <linux/gpio/consumer.h>
>  #include <linux/spi/spi.h>
>  #include <linux/interrupt.h>
> @@ -21,10 +20,6 @@
>  #include "main.h"
>  #include "bh.h"
> 
> -static int gpio_reset = -2;
> -module_param(gpio_reset, int, 0644);
> -MODULE_PARM_DESC(gpio_reset, "gpio number for reset. -1 for none.");
> -
>  #define SET_WRITE 0x7FFF        /* usage: and operation */
>  #define SET_READ 0x8000         /* usage: or operation */
> 
> @@ -211,10 +206,14 @@ static int wfx_spi_probe(struct spi_device *func)
>                 bus->need_swab = true;
>         spi_set_drvdata(func, bus);
> 
> -       bus->gpio_reset = wfx_get_gpio(&func->dev, gpio_reset, "reset");
> +       bus->gpio_reset = devm_gpiod_get_optional(&func->dev, "reset"
> +                                                 GPIOD_OUT_HIGH);

The original code asks for GPIOD_OUT_LOW.

> +       if (IS_ERR(bus->gpio_reset))
> +               return PTR_ERR(bus->gpio_reset);
>         if (!bus->gpio_reset) {
>                 dev_warn(&func->dev, "try to load firmware anyway\n");

In the original code, this case also generated the warning "gpio reset is
not defined" (raised from wfx_get_gpio()). I suggest to change the warning
below into "gpio reset is not defined, try to load firmware anyway\n".

>         } else {
> +               gpiod_set_consumer_name(bus->gpio_reset, "wfx reset");
>                 if (spi_get_device_id(func)->driver_data & WFX_RESET_INVERTED)
>                         gpiod_toggle_active_low(bus->gpio_reset);
>                 gpiod_set_value_cansleep(bus->gpio_reset, 1);
> diff --git a/drivers/staging/wfx/main.c b/drivers/staging/wfx/main.c
> index 6bd96f476388..d90169fe1851 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 at 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,10 @@ 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(dev, "wakeup", GPIOD_IN);

GPIOD_OUT_LOW?

> +       if (IS_ERR(wdev->pdata.gpio_wakeup))
> +               return ERR_CAST(wdev->pdata.gpio_wakeup);

This code will fail if the "wakeup" attribute is not defined. I suggest to
just print a notification and continue (the previous code printed a warning,
but the level INFO is sufficient). 


> +       gpiod_set_consumer_name(wdev->pdata.gpio_wakeup, "wfx wakeup");
>         wfx_sl_fill_pdata(dev, &wdev->pdata);
> 
>         mutex_init(&wdev->conf_mutex);
> diff --git a/drivers/staging/wfx/main.h b/drivers/staging/wfx/main.h
> index f832ce409fda..c59d375dd3ad 100644
> --- a/drivers/staging/wfx/main.h
> +++ b/drivers/staging/wfx/main.h
> @@ -38,8 +38,6 @@ struct wfx_dev *wfx_init_common(struct device *dev,
>  int wfx_probe(struct wfx_dev *wdev);
>  void wfx_release(struct wfx_dev *wdev);
> 
> -struct gpio_desc *wfx_get_gpio(struct device *dev, int override,
> -                              const char *label);
>  bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor);
>  int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len);
> 
> --
> 2.25.4
> 
> 


-- 
Jérôme Pouiller




More information about the devel mailing list