generic: 6.1: sync mt7530 DSA driver with upstream
[openwrt/openwrt.git] / target / linux / generic / backport-6.1 / 790-10-v6.4-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch
diff --git a/target/linux/generic/backport-6.1/790-10-v6.4-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch b/target/linux/generic/backport-6.1/790-10-v6.4-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch
new file mode 100644 (file)
index 0000000..8950caa
--- /dev/null
@@ -0,0 +1,155 @@
+From a0c6527a38d518ff175c1b6ce248e9b06cc98d3b Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Mon, 3 Apr 2023 02:18:39 +0100
+Subject: [PATCH 10/48] net: dsa: mt7530: introduce mt7530_probe_common helper
+ function
+
+Move commonly used parts from mt7530_probe into new mt7530_probe_common
+helper function which will be used by both, mt7530_probe and the
+to-be-introduced mt7988_probe.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/dsa/mt7530.c | 98 ++++++++++++++++++++++------------------
+ 1 file changed, 54 insertions(+), 44 deletions(-)
+
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -3210,44 +3210,21 @@ static const struct of_device_id mt7530_
+ MODULE_DEVICE_TABLE(of, mt7530_of_match);
+ static int
+-mt7530_probe(struct mdio_device *mdiodev)
++mt7530_probe_common(struct mt7530_priv *priv)
+ {
+-      static struct regmap_config *regmap_config;
+-      struct mt7530_priv *priv;
+-      struct device_node *dn;
+-      int ret;
++      struct device *dev = priv->dev;
+-      dn = mdiodev->dev.of_node;
+-
+-      priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL);
+-      if (!priv)
+-              return -ENOMEM;
+-
+-      priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL);
++      priv->ds = devm_kzalloc(dev, sizeof(*priv->ds), GFP_KERNEL);
+       if (!priv->ds)
+               return -ENOMEM;
+-      priv->ds->dev = &mdiodev->dev;
++      priv->ds->dev = dev;
+       priv->ds->num_ports = MT7530_NUM_PORTS;
+-      /* Use medatek,mcm property to distinguish hardware type that would
+-       * casues a little bit differences on power-on sequence.
+-       */
+-      priv->mcm = of_property_read_bool(dn, "mediatek,mcm");
+-      if (priv->mcm) {
+-              dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n");
+-
+-              priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm");
+-              if (IS_ERR(priv->rstc)) {
+-                      dev_err(&mdiodev->dev, "Couldn't get our reset line\n");
+-                      return PTR_ERR(priv->rstc);
+-              }
+-      }
+-
+       /* Get the hardware identifier from the devicetree node.
+        * We will need it for some of the clock and regulator setup.
+        */
+-      priv->info = of_device_get_match_data(&mdiodev->dev);
++      priv->info = of_device_get_match_data(dev);
+       if (!priv->info)
+               return -EINVAL;
+@@ -3261,23 +3238,53 @@ mt7530_probe(struct mdio_device *mdiodev
+               return -EINVAL;
+       priv->id = priv->info->id;
++      priv->dev = dev;
++      priv->ds->priv = priv;
++      priv->ds->ops = &mt7530_switch_ops;
++      mutex_init(&priv->reg_mutex);
++      dev_set_drvdata(dev, priv);
+-      if (priv->id == ID_MT7530) {
+-              priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core");
+-              if (IS_ERR(priv->core_pwr))
+-                      return PTR_ERR(priv->core_pwr);
++      return 0;
++}
+-              priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io");
+-              if (IS_ERR(priv->io_pwr))
+-                      return PTR_ERR(priv->io_pwr);
+-      }
++static int
++mt7530_probe(struct mdio_device *mdiodev)
++{
++      static struct regmap_config *regmap_config;
++      struct mt7530_priv *priv;
++      struct device_node *dn;
++      int ret;
++
++      dn = mdiodev->dev.of_node;
++
++      priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL);
++      if (!priv)
++              return -ENOMEM;
+-      /* Not MCM that indicates switch works as the remote standalone
++      priv->bus = mdiodev->bus;
++      priv->dev = &mdiodev->dev;
++
++      ret = mt7530_probe_common(priv);
++      if (ret)
++              return ret;
++
++      /* Use medatek,mcm property to distinguish hardware type that would
++       * cause a little bit differences on power-on sequence.
++       * Not MCM that indicates switch works as the remote standalone
+        * integrated circuit so the GPIO pin would be used to complete
+        * the reset, otherwise memory-mapped register accessing used
+        * through syscon provides in the case of MCM.
+        */
+-      if (!priv->mcm) {
++      priv->mcm = of_property_read_bool(dn, "mediatek,mcm");
++      if (priv->mcm) {
++              dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n");
++
++              priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm");
++              if (IS_ERR(priv->rstc)) {
++                      dev_err(&mdiodev->dev, "Couldn't get our reset line\n");
++                      return PTR_ERR(priv->rstc);
++              }
++      } else {
+               priv->reset = devm_gpiod_get_optional(&mdiodev->dev, "reset",
+                                                     GPIOD_OUT_LOW);
+               if (IS_ERR(priv->reset)) {
+@@ -3286,12 +3293,15 @@ mt7530_probe(struct mdio_device *mdiodev
+               }
+       }
+-      priv->bus = mdiodev->bus;
+-      priv->dev = &mdiodev->dev;
+-      priv->ds->priv = priv;
+-      priv->ds->ops = &mt7530_switch_ops;
+-      mutex_init(&priv->reg_mutex);
+-      dev_set_drvdata(&mdiodev->dev, priv);
++      if (priv->id == ID_MT7530) {
++              priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core");
++              if (IS_ERR(priv->core_pwr))
++                      return PTR_ERR(priv->core_pwr);
++
++              priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io");
++              if (IS_ERR(priv->io_pwr))
++                      return PTR_ERR(priv->io_pwr);
++      }
+       regmap_config = devm_kzalloc(&mdiodev->dev, sizeof(*regmap_config),
+                                    GFP_KERNEL);