lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <tencent_0A154BBE38E000228C01BE742CB73681FE09@qq.com>
Date: Sun,  9 Mar 2025 15:47:08 +0800
From: Hanyuan Zhao <hanyuan-z@...com>
To: davem@...emloft.net,
	kuba@...nel.org,
	andrew+netdev@...n.ch,
	edumazet@...gle.com,
	pabeni@...hat.com
Cc: netdev@...r.kernel.org,
	linux-kernel@...r.kernel.org,
	Hanyuan Zhao <hanyuan-z@...com>
Subject: [PATCH 1/2] net: enc28j60: support getting irq number from gpio phandle in the device tree

This patch allows the kernel to automatically requests the pin, configures
it as an input, and converts it to an IRQ number, according to a GPIO
phandle specified in device tree. This simplifies the process by
eliminating the need to manually define pinctrl and interrupt nodes.
Additionally, it is necessary for platforms that do not support pin
configuration and properties via the device tree.

Signed-off-by: Hanyuan Zhao <hanyuan-z@...com>
---
 drivers/net/ethernet/microchip/enc28j60.c | 25 ++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/microchip/enc28j60.c b/drivers/net/ethernet/microchip/enc28j60.c
index d6c9491537e4..b3613e45c900 100644
--- a/drivers/net/ethernet/microchip/enc28j60.c
+++ b/drivers/net/ethernet/microchip/enc28j60.c
@@ -24,6 +24,7 @@
 #include <linux/skbuff.h>
 #include <linux/delay.h>
 #include <linux/spi/spi.h>
+#include <linux/of_gpio.h>
 
 #include "enc28j60_hw.h"
 
@@ -1526,6 +1527,7 @@ static int enc28j60_probe(struct spi_device *spi)
 	struct net_device *dev;
 	struct enc28j60_net *priv;
 	int ret = 0;
+	unsigned long irq_flags = IRQF_ONESHOT;
 
 	if (netif_msg_drv(&debug))
 		dev_info(&spi->dev, "Ethernet driver %s loaded\n", DRV_VERSION);
@@ -1558,20 +1560,33 @@ static int enc28j60_probe(struct spi_device *spi)
 		eth_hw_addr_random(dev);
 	enc28j60_set_hw_macaddr(dev);
 
+	if (spi->irq > 0) {
+		dev->irq = spi->irq;
+	} else {
+		/* Try loading device tree property irq-gpios */
+		struct gpio_desc *irq_gpio_desc = devm_fwnode_gpiod_get_index(&spi->dev,
+				of_fwnode_handle(spi->dev.of_node), "irq", 0, GPIOD_IN, NULL);
+		if (IS_ERR(irq_gpio_desc)) {
+			dev_err(&spi->dev, "unable to get a valid irq gpio\n");
+			goto error_irq;
+		}
+		dev->irq = gpiod_to_irq(irq_gpio_desc);
+		irq_flags |= IRQF_TRIGGER_FALLING;
+	}
+
 	/* Board setup must set the relevant edge trigger type;
 	 * level triggers won't currently work.
 	 */
-	ret = request_threaded_irq(spi->irq, NULL, enc28j60_irq, IRQF_ONESHOT,
+	ret = request_threaded_irq(dev->irq, NULL, enc28j60_irq, irq_flags,
 				   DRV_NAME, priv);
 	if (ret < 0) {
 		if (netif_msg_probe(priv))
 			dev_err(&spi->dev, "request irq %d failed (ret = %d)\n",
-				spi->irq, ret);
+				dev->irq, ret);
 		goto error_irq;
 	}
 
 	dev->if_port = IF_PORT_10BASET;
-	dev->irq = spi->irq;
 	dev->netdev_ops = &enc28j60_netdev_ops;
 	dev->watchdog_timeo = TX_TIMEOUT;
 	dev->ethtool_ops = &enc28j60_ethtool_ops;
@@ -1589,7 +1604,7 @@ static int enc28j60_probe(struct spi_device *spi)
 	return 0;
 
 error_register:
-	free_irq(spi->irq, priv);
+	free_irq(dev->irq, priv);
 error_irq:
 	free_netdev(dev);
 error_alloc:
@@ -1601,7 +1616,7 @@ static void enc28j60_remove(struct spi_device *spi)
 	struct enc28j60_net *priv = spi_get_drvdata(spi);
 
 	unregister_netdev(priv->netdev);
-	free_irq(spi->irq, priv);
+	free_irq(priv->netdev->irq, priv);
 	free_netdev(priv->netdev);
 }
 
-- 
2.43.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ