Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 367b9559 authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman
Browse files

staging: wilc1000: use descriptor-based interface for GPIO



Now making use of descriptor-based interface instead of integer-based
interface for IRQ GPIO.
Added device tree binding reference for WILC SDIO and SPI interface
module. Also moved the code to free gpio descriptor in module remove
as the reference was fetched in probe function.
Updated the TODO file

Signed-off-by: default avatarAjay Singh <ajay.kathat@microchip.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8dfaf859
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -3,7 +3,3 @@ TODO:
- make spi and sdio components coexist in one build
- support soft-ap and p2p mode
- support resume/suspend function
- convert all uses of the old GPIO API from <linux/gpio.h> to the
  GPIO descriptor API in <linux/gpio/consumer.h> and look up GPIO
  lines from device tree, ACPI or board files, board files should
  use <linux/gpio/machine.h>
+16 −24
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/kthread.h>
#include <linux/firmware.h>
#include <linux/netdevice.h>
@@ -127,28 +126,23 @@ static int init_irq(struct net_device *dev)
	struct wilc_vif *vif = netdev_priv(dev);
	struct wilc *wl = vif->wilc;

	if ((gpio_request(wl->gpio_irq, "WILC_INTR") == 0) &&
	    (gpio_direction_input(wl->gpio_irq) == 0)) {
		wl->dev_irq_num = gpio_to_irq(wl->gpio_irq);
	} else {
		ret = -1;
	ret = gpiod_direction_input(wl->gpio_irq);
	if (ret) {
		netdev_err(dev, "could not obtain gpio for WILC_INTR\n");
		return ret;
	}

	if (ret != -1 && request_threaded_irq(wl->dev_irq_num,
					      isr_uh_routine,
	wl->dev_irq_num = gpiod_to_irq(wl->gpio_irq);

	ret = request_threaded_irq(wl->dev_irq_num, isr_uh_routine,
				   isr_bh_routine,
				   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
					      "WILC_IRQ", dev) < 0) {
		netdev_err(dev, "Failed to request IRQ GPIO: %d\n",
			   wl->gpio_irq);
		gpio_free(wl->gpio_irq);
		ret = -1;
	} else {
		netdev_dbg(dev,
			   "IRQ request succeeded IRQ-NUM= %d on GPIO: %d\n",
			   wl->dev_irq_num, wl->gpio_irq);
	}
				   "WILC_IRQ", dev);
	if (ret < 0)
		netdev_err(dev, "Failed to request IRQ\n");
	else
		netdev_dbg(dev, "IRQ request succeeded IRQ-NUM= %d\n",
			   wl->dev_irq_num);

	return ret;
}
@@ -159,10 +153,8 @@ static void deinit_irq(struct net_device *dev)
	struct wilc *wilc = vif->wilc;

	/* Deinitialize IRQ */
	if (wilc->dev_irq_num) {
	if (wilc->dev_irq_num)
		free_irq(wilc->dev_irq_num, wilc);
		gpio_free(wilc->gpio_irq);
	}
}

void wilc_mac_indicate(struct wilc *wilc)
@@ -652,7 +644,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif)
			goto fail_locks;
		}

		if (wl->gpio_irq >= 0 && init_irq(dev)) {
		if (wl->gpio_irq && init_irq(dev)) {
			ret = -EIO;
			goto fail_locks;
		}
+32 −0
Original line number Diff line number Diff line
* Microchip WILC wireless SDIO device

The wilc1000 chips can be connected via SDIO. The node is used to specifiy
child node to the SDIO controller that connects the device to the system.

Required properties:
- compatible	:	Should be "microchip,wilc1000-spi"
- irq-gpios	:	Connect to a host IRQ
- reg		:	Slot ID used in the controller

Optional:
- bus-width	:	Number of data lines wired up the slot. Default 1 bit.


Examples:
mmc1: mmc@fc000000 {
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3>;
		non-removable;
		vmmc-supply = <&vcc_mmc1_reg>;
		vqmmc-supply = <&vcc_3v3_reg>;
		status = "okay";

		wilc_sdio@0 {
			compatible = "microchip,wilc1000-sdio";
			irq-gpios = <&pioC 27 0>;
			status = "okay";
			reg = <0>;
			bus-width = <4>;
		}
	};
}
+26 −0
Original line number Diff line number Diff line
* Microchip WILC wireless SPI device

The wilc1000 chips can be connected via SPI. This document describes
the binding for the SPI connected module.

Required properties:
- compatible		: Should be "microchip,wilc1000-spi"
- spi-max-frequency	: Maximum SPI clocking speed of device in Hz
- reg			: Chip select address of device
- irq-gpios		: Connect to a host IRQ


Examples:

spi1: spi@fc018000 {
		cs-gpios = <&pioB 21 0>;
		status = "okay";

		wilc_spi@0 {
			compatible = "microchip,wilc1000-spi";
			spi-max-frequency = <48000000>;
			reg = <0>;
			irq-gpios = <&pioC 27 0>;
			status = "okay";
		};
};
+16 −7
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
 */

#include <linux/mmc/sdio_func.h>
#include <linux/of_gpio.h>
#include <linux/mmc/host.h>

#include "wilc_wfi_netdevice.h"

@@ -108,13 +108,17 @@ static int linux_sdio_probe(struct sdio_func *func,
			    const struct sdio_device_id *id)
{
	struct wilc *wilc;
	int gpio, ret;
	int ret;
	struct gpio_desc *gpio = NULL;

	gpio = -1;
	if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
		gpio = of_get_gpio(func->dev.of_node, 0);
		if (gpio < 0)
			gpio = GPIO_NUM;
		gpio = gpiod_get(&func->dev, "irq", GPIOD_IN);
		if (IS_ERR(gpio)) {
			/* get the GPIO descriptor from hardcode GPIO number */
			gpio = gpio_to_desc(GPIO_NUM);
			if (!gpio)
				dev_err(&func->dev, "failed to get irq gpio\n");
		}
	}

	dev_dbg(&func->dev, "Initializing netdev\n");
@@ -133,7 +137,12 @@ static int linux_sdio_probe(struct sdio_func *func,

static void linux_sdio_remove(struct sdio_func *func)
{
	wilc_netdev_cleanup(sdio_get_drvdata(func));
	struct wilc *wilc = sdio_get_drvdata(func);

	/* free the GPIO in module remove */
	if (wilc->gpio_irq)
		gpiod_put(wilc->gpio_irq);
	wilc_netdev_cleanup(wilc);
}

static int sdio_reset(struct wilc *wilc)
Loading