summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2023-06-22 09:23:23 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-06-23 11:27:36 +0200
commitb1f0e5eda3315ad3af9161e88bd6ff18e6534811 (patch)
treebcf46bfdcfa4c440cdfc0c139fc08d244195713f /drivers/net
parent871167c316484a382dca97d40b47aa9a95f2d383 (diff)
downloadbarebox-b1f0e5eda3315ad3af9161e88bd6ff18e6534811.tar.gz
barebox-b1f0e5eda3315ad3af9161e88bd6ff18e6534811.tar.xz
gpio: have gpiod_ functions return and accept pointers
The gpiod_ (GPIO descriptor) API used with Linux differs from barebox' normal GPIO API: - gpiod handles are opaque pointers and not an integer, which users have an expectation of stability for - gpiod API uses logic levels by default with separate raw API for physical level instead of physical level by default and separate API taking active level into account. The barebox gpiod_ API mimics the latter point, but still uses integers requiring ugly and arguably error prone conversions when porting kernel code. Let's improve upon that by just encoding the integer into a pointer variable for API compatibility. Later commits will switch barebox GPIO support to use actual GPIO descriptors without consulting the numeric indices, but we do this temporary switch here, so we can split up provider and consumer changes. Reviewed-by: Marco Felsch <m.felsch@pengutronix.de> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20230622072329.1339317-4-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/designware_eqos.c28
-rw-r--r--drivers/net/ksz8873.c13
-rw-r--r--drivers/net/ksz9477.c13
-rw-r--r--drivers/net/realtek-dsa/realtek-mdio.c10
-rw-r--r--drivers/net/realtek-dsa/realtek-smi.c18
-rw-r--r--drivers/net/realtek-dsa/realtek.h6
-rw-r--r--drivers/net/sja1105.c27
7 files changed, 61 insertions, 54 deletions
diff --git a/drivers/net/designware_eqos.c b/drivers/net/designware_eqos.c
index 3fa5bf58c2..5e5c9ebe68 100644
--- a/drivers/net/designware_eqos.c
+++ b/drivers/net/designware_eqos.c
@@ -9,7 +9,7 @@
#include <common.h>
#include <init.h>
#include <gpio.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <dma.h>
#include <net.h>
#include <of_net.h>
@@ -200,21 +200,21 @@ struct eqos_desc {
static int eqos_phy_reset(struct device *dev, struct eqos *eqos)
{
- int phy_reset;
+ struct gpio_desc *phy_reset;
u32 delays[3] = { 0, 0, 0 };
- phy_reset = gpiod_get(dev, "snps,reset", GPIOF_OUT_INIT_ACTIVE);
-
- if (!gpio_is_valid(phy_reset))
- return 0;
-
- of_property_read_u32_array(dev->of_node,
- "snps,reset-delays-us",
- delays, ARRAY_SIZE(delays));
-
- udelay(delays[1]);
- gpio_set_active(phy_reset, false);
- udelay(delays[2]);
+ phy_reset = gpiod_get_optional(dev, "snps,reset", GPIOF_OUT_INIT_ACTIVE);
+ if (IS_ERR(phy_reset)) {
+ dev_warn(dev, "Failed to get 'snps,reset' GPIO (ignored)\n");
+ } else if (phy_reset) {
+ of_property_read_u32_array(dev->of_node,
+ "snps,reset-delays-us",
+ delays, ARRAY_SIZE(delays));
+
+ udelay(delays[1]);
+ gpiod_set_value(phy_reset, false);
+ udelay(delays[2]);
+ }
return 0;
}
diff --git a/drivers/net/ksz8873.c b/drivers/net/ksz8873.c
index 35ef0d2da2..7e98ec492a 100644
--- a/drivers/net/ksz8873.c
+++ b/drivers/net/ksz8873.c
@@ -3,7 +3,7 @@
#include <common.h>
#include <complete.h>
#include <dsa.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <linux/mii.h>
#include <linux/mdio.h>
#include <net.h>
@@ -369,7 +369,8 @@ static int ksz8873_probe_mdio(struct phy_device *mdiodev)
const struct ksz8873_dcfg *dcfg;
struct ksz8873_switch *priv;
struct dsa_switch *ds;
- int ret, gpio;
+ struct gpio_desc *gpio;
+ int ret;
u8 id0, id1;
priv = xzalloc(sizeof(*priv));
@@ -389,10 +390,12 @@ static int ksz8873_probe_mdio(struct phy_device *mdiodev)
return dev_err_probe(dev, PTR_ERR(priv->regmap),
"Failed to initialize regmap.\n");
- gpio = gpiod_get(dev, "reset", GPIOF_OUT_INIT_ACTIVE);
- if (gpio_is_valid(gpio)) {
+ gpio = gpiod_get_optional(dev, "reset", GPIOF_OUT_INIT_ACTIVE);
+ if (IS_ERR(gpio)) {
+ dev_warn(dev, "Failed to get 'reset' GPIO (ignored)\n");
+ } else if (gpio) {
mdelay(1);
- gpio_set_active(gpio, false);
+ gpiod_set_value(gpio, false);
}
ret = ksz_read8(priv, KSZ8873_CHIP_ID0, &id0);
diff --git a/drivers/net/ksz9477.c b/drivers/net/ksz9477.c
index 4b876055f6..61142aa97b 100644
--- a/drivers/net/ksz9477.c
+++ b/drivers/net/ksz9477.c
@@ -3,7 +3,7 @@
#include <common.h>
#include <complete.h>
#include <dsa.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <net.h>
#include <platform_data/ksz9477_reg.h>
#include <spi/spi.h>
@@ -410,7 +410,8 @@ static int microchip_switch_probe(struct device *dev)
{
struct device *hw_dev;
struct ksz_switch *priv;
- int ret = 0, gpio;
+ struct gpio_desc *gpio;
+ int ret = 0;
struct dsa_switch *ds;
priv = xzalloc(sizeof(*priv));
@@ -432,10 +433,12 @@ static int microchip_switch_probe(struct device *dev)
if (ret)
return ret;
- gpio = gpiod_get(dev, "reset", GPIOF_OUT_INIT_ACTIVE);
- if (gpio_is_valid(gpio)) {
+ gpio = gpiod_get_optional(dev, "reset", GPIOF_OUT_INIT_ACTIVE);
+ if (IS_ERR(gpio)) {
+ dev_warn(dev, "Failed to get 'reset' GPIO (ignored)\n");
+ } else if (gpio) {
mdelay(1);
- gpio_set_active(gpio, false);
+ gpiod_set_value(gpio, false);
}
ksz_reset_switch(dev->priv);
diff --git a/drivers/net/realtek-dsa/realtek-mdio.c b/drivers/net/realtek-dsa/realtek-mdio.c
index a869308035..6776609b04 100644
--- a/drivers/net/realtek-dsa/realtek-mdio.c
+++ b/drivers/net/realtek-dsa/realtek-mdio.c
@@ -22,7 +22,7 @@
#include <of_device.h>
#include <regmap.h>
#include <clock.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <linux/printk.h>
#include <linux/mdio.h>
@@ -151,11 +151,11 @@ static int realtek_mdio_probe(struct phy_device *mdiodev)
/* TODO: if power is software controlled, set up any regulators here */
priv->leds_disabled = of_property_read_bool(np, "realtek,disable-leds");
- priv->reset = gpiod_get(dev, "reset", GPIOD_OUT_LOW);
- if (priv->reset < 0 && priv->reset != -ENOENT)
- return dev_err_probe(dev, priv->reset, "failed to get RESET GPIO\n");
+ priv->reset = gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+ if (IS_ERR(priv->reset))
+ return dev_errp_probe(dev, priv->reset, "failed to get RESET GPIO\n");
- if (gpio_is_valid(priv->reset)) {
+ if (priv->reset) {
gpiod_set_value(priv->reset, 1);
dev_dbg(dev, "asserted RESET\n");
mdelay(REALTEK_HW_STOP_DELAY);
diff --git a/drivers/net/realtek-dsa/realtek-smi.c b/drivers/net/realtek-dsa/realtek-smi.c
index 35b3d30a06..8e6f0e2ad9 100644
--- a/drivers/net/realtek-dsa/realtek-smi.c
+++ b/drivers/net/realtek-dsa/realtek-smi.c
@@ -33,7 +33,7 @@
#include <linux/mdio.h>
#include <linux/printk.h>
#include <clock.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <driver.h>
#include <regmap.h>
#include <linux/bitops.h>
@@ -413,11 +413,11 @@ static int realtek_smi_probe(struct device *dev)
/* TODO: if power is software controlled, set up any regulators here */
- priv->reset = gpiod_get(dev, "reset", GPIOD_OUT_LOW);
- if (priv->reset < 0 && priv->reset != -ENOENT)
- return dev_err_probe(dev, priv->reset, "failed to get RESET GPIO\n");
+ priv->reset = gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+ if (IS_ERR(priv->reset))
+ return dev_errp_probe(dev, priv->reset, "failed to get RESET GPIO\n");
- if (gpio_is_valid(priv->reset)) {
+ if (priv->reset) {
gpiod_set_value(priv->reset, 1);
dev_dbg(dev, "asserted RESET\n");
mdelay(REALTEK_HW_STOP_DELAY);
@@ -428,12 +428,12 @@ static int realtek_smi_probe(struct device *dev)
/* Fetch MDIO pins */
priv->mdc = gpiod_get(dev, "mdc", GPIOD_OUT_LOW);
- if (!gpio_is_valid(priv->mdc))
- return dev_err_probe(dev, priv->mdc, "failed to get MDC GPIO\n");
+ if (IS_ERR(priv->mdc))
+ return dev_errp_probe(dev, priv->mdc, "failed to get MDC GPIO\n");
priv->mdio = gpiod_get(dev, "mdio", GPIOD_OUT_LOW);
- if (!gpio_is_valid(priv->mdio))
- return dev_err_probe(dev, priv->mdio, "failed to get MDIO GPIO\n");
+ if (IS_ERR(priv->mdio))
+ return dev_errp_probe(dev, priv->mdio, "failed to get MDIO GPIO\n");
priv->leds_disabled = of_property_read_bool(np, "realtek,disable-leds");
diff --git a/drivers/net/realtek-dsa/realtek.h b/drivers/net/realtek-dsa/realtek.h
index 46a2282f6e..ac84b18cdd 100644
--- a/drivers/net/realtek-dsa/realtek.h
+++ b/drivers/net/realtek-dsa/realtek.h
@@ -21,9 +21,9 @@ struct realtek_ops;
struct realtek_priv {
struct device *dev;
- int reset;
- int mdc;
- int mdio;
+ struct gpio_desc *reset;
+ struct gpio_desc *mdc;
+ struct gpio_desc *mdio;
union {
struct regmap *map;
struct regmap *map_nolock;
diff --git a/drivers/net/sja1105.c b/drivers/net/sja1105.c
index ef874ed482..d88a5e2fcf 100644
--- a/drivers/net/sja1105.c
+++ b/drivers/net/sja1105.c
@@ -10,7 +10,7 @@
#include <common.h>
#include <dsa.h>
-#include <gpiod.h>
+#include <linux/gpio/consumer.h>
#include <linux/bitrev.h>
#include <linux/if_vlan.h>
#include <net.h>
@@ -2883,18 +2883,19 @@ static int sja1105_check_device_id(struct sja1105_private *priv)
static int sja1105_hw_reset(struct device *dev, unsigned int pulse_len,
unsigned int startup_delay)
{
- int gpio;
-
- gpio = gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
- if (gpio < 0)
- return 0;
-
- gpiod_set_value(gpio, 1);
- /* Wait for minimum reset pulse length */
- mdelay(pulse_len);
- gpiod_set_value(gpio, 0);
- /* Wait until chip is ready after reset */
- mdelay(startup_delay);
+ struct gpio_desc *gpio;
+
+ gpio = gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(gpio)) {
+ dev_warn(dev, "Failed to get 'reset' GPIO (ignored)\n");
+ } else if (gpio) {
+ gpiod_set_value(gpio, 1);
+ /* Wait for minimum reset pulse length */
+ mdelay(pulse_len);
+ gpiod_set_value(gpio, 0);
+ /* Wait until chip is ready after reset */
+ mdelay(startup_delay);
+ }
return 0;
}