net: dsa: sja1105: don't keep a persistent reference to the reset GPIO
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 22 Sep 2021 15:10:29 +0000 (18:10 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Sep 2021 11:46:22 +0000 (12:46 +0100)
The driver only needs the reset GPIO for a very brief period, so instead
of using devres and keeping the descriptor pointer inside priv, just use
that descriptor inside the sja1105_hw_reset function and then let go of
it.

Also use gpiod_get_optional while at it, and error out on real errors
(bad flags etc).

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105.h
drivers/net/dsa/sja1105/sja1105_main.c

index 5e5d24e7c02b2d18183422a108cfc82dbf2096db..6595348f1ea38994707d96211705e4bd8811e740 100644 (file)
@@ -231,7 +231,6 @@ struct sja1105_private {
        unsigned long bcast_egress_floods;
        const struct sja1105_info *info;
        size_t max_xfer_len;
-       struct gpio_desc *reset_gpio;
        struct spi_device *spidev;
        struct dsa_switch *ds;
        u16 bridge_pvid[SJA1105_MAX_NUM_PORTS];
index d5f8166b73b1540f6cd49bebc9975107620f29ae..80f7109cb8d6c0d2c36fe1be121c9f7b387e2784 100644 (file)
 
 #define SJA1105_UNKNOWN_MULTICAST      0x010000000000ull
 
-static void sja1105_hw_reset(struct gpio_desc *gpio, unsigned int pulse_len,
-                            unsigned int startup_delay)
+/* Configure the optional reset pin and bring up switch */
+static int sja1105_hw_reset(struct device *dev, unsigned int pulse_len,
+                           unsigned int startup_delay)
 {
+       struct gpio_desc *gpio;
+
+       gpio = gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(gpio))
+               return PTR_ERR(gpio);
+
+       if (!gpio)
+               return 0;
+
        gpiod_set_value_cansleep(gpio, 1);
        /* Wait for minimum reset pulse length */
        msleep(pulse_len);
        gpiod_set_value_cansleep(gpio, 0);
        /* Wait until chip is ready after reset */
        msleep(startup_delay);
+
+       gpiod_put(gpio);
+
+       return 0;
 }
 
 static void
@@ -3228,17 +3242,14 @@ static int sja1105_probe(struct spi_device *spi)
                return -EINVAL;
        }
 
+       rc = sja1105_hw_reset(dev, 1, 1);
+       if (rc)
+               return rc;
+
        priv = devm_kzalloc(dev, sizeof(struct sja1105_private), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
-       /* Configure the optional reset pin and bring up switch */
-       priv->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
-       if (IS_ERR(priv->reset_gpio))
-               dev_dbg(dev, "reset-gpios not defined, ignoring\n");
-       else
-               sja1105_hw_reset(priv->reset_gpio, 1, 1);
-
        /* Populate our driver private structure (priv) based on
         * the device tree node that was probed (spi)
         */