Extend the ID to name table to also include the number of ports.
Saves a few switch statements and it is likely other entries will be
added to the table later.

Signed-off-by: Andrew Lunn <and...@lunn.ch>
---
 drivers/net/dsa/mv88e6123.c | 30 +++++++++---------------------
 drivers/net/dsa/mv88e6131.c | 25 +++++--------------------
 drivers/net/dsa/mv88e6171.c | 10 ++++------
 drivers/net/dsa/mv88e6352.c | 26 ++++++++++++--------------
 drivers/net/dsa/mv88e6xxx.c | 35 +++++++++++++++++++++--------------
 drivers/net/dsa/mv88e6xxx.h |  1 +
 6 files changed, 52 insertions(+), 75 deletions(-)

diff --git a/drivers/net/dsa/mv88e6123.c b/drivers/net/dsa/mv88e6123.c
index b4dd7ef039da..ac2e6609367d 100644
--- a/drivers/net/dsa/mv88e6123.c
+++ b/drivers/net/dsa/mv88e6123.c
@@ -20,15 +20,15 @@
 #include "mv88e6xxx.h"
 
 static const struct mv88e6xxx_switch_id mv88e6123_table[] = {
-       { PORT_SWITCH_ID_6123, "Marvell 88E6123" },
-       { PORT_SWITCH_ID_6123_A1, "Marvell 88E6123 (A1)" },
-       { PORT_SWITCH_ID_6123_A2, "Marvell 88E6123 (A2)" },
-       { PORT_SWITCH_ID_6161, "Marvell 88E6161" },
-       { PORT_SWITCH_ID_6161_A1, "Marvell 88E6161 (A1)" },
-       { PORT_SWITCH_ID_6161_A2, "Marvell 88E6161 (A2)" },
-       { PORT_SWITCH_ID_6165, "Marvell 88E6165" },
-       { PORT_SWITCH_ID_6165_A1, "Marvell 88E6165 (A1)" },
-       { PORT_SWITCH_ID_6165_A2, "Marvell 88e6165 (A2)" },
+       { PORT_SWITCH_ID_6123,          "Marvell 88E6123",              3 },
+       { PORT_SWITCH_ID_6123_A1,       "Marvell 88E6123 (A1)",         3 },
+       { PORT_SWITCH_ID_6123_A2,       "Marvell 88E6123 (A2)",         3 },
+       { PORT_SWITCH_ID_6161,          "Marvell 88E6161",              6 },
+       { PORT_SWITCH_ID_6161_A1,       "Marvell 88E6161 (A1)",         6 },
+       { PORT_SWITCH_ID_6161_A2,       "Marvell 88E6161 (A2)",         6 },
+       { PORT_SWITCH_ID_6165,          "Marvell 88E6165",              6 },
+       { PORT_SWITCH_ID_6165_A1,       "Marvell 88E6165 (A1)",         6 },
+       { PORT_SWITCH_ID_6165_A2,       "Marvell 88e6165 (A2)",         6 },
 };
 
 static char *mv88e6123_drv_probe(struct device *dsa_dev,
@@ -88,18 +88,6 @@ static int mv88e6123_setup(struct dsa_switch *ds)
        if (ret < 0)
                return ret;
 
-       switch (ps->id) {
-       case PORT_SWITCH_ID_6123:
-               ps->num_ports = 3;
-               break;
-       case PORT_SWITCH_ID_6161:
-       case PORT_SWITCH_ID_6165:
-               ps->num_ports = 6;
-               break;
-       default:
-               return -ENODEV;
-       }
-
        ret = mv88e6xxx_switch_reset(ps, false);
        if (ret < 0)
                return ret;
diff --git a/drivers/net/dsa/mv88e6131.c b/drivers/net/dsa/mv88e6131.c
index 1659d4dc93c0..969f67c77835 100644
--- a/drivers/net/dsa/mv88e6131.c
+++ b/drivers/net/dsa/mv88e6131.c
@@ -20,11 +20,11 @@
 #include "mv88e6xxx.h"
 
 static const struct mv88e6xxx_switch_id mv88e6131_table[] = {
-       { PORT_SWITCH_ID_6085, "Marvell 88E6085" },
-       { PORT_SWITCH_ID_6095, "Marvell 88E6095/88E6095F" },
-       { PORT_SWITCH_ID_6131, "Marvell 88E6131" },
-       { PORT_SWITCH_ID_6131_B2, "Marvell 88E6131 (B2)" },
-       { PORT_SWITCH_ID_6185, "Marvell 88E6185" },
+       { PORT_SWITCH_ID_6085,          "Marvell 88E6085",              10 },
+       { PORT_SWITCH_ID_6095,          "Marvell 88E6095/88E6095F",     11 },
+       { PORT_SWITCH_ID_6131,          "Marvell 88E6131",              8 },
+       { PORT_SWITCH_ID_6131_B2,       "Marvell 88E6131 (B2)",         8 },
+       { PORT_SWITCH_ID_6185,          "Marvell 88E6185",              10 },
 };
 
 static char *mv88e6131_drv_probe(struct device *dsa_dev,
@@ -112,21 +112,6 @@ static int mv88e6131_setup(struct dsa_switch *ds)
 
        mv88e6xxx_ppu_state_init(ps);
 
-       switch (ps->id) {
-       case PORT_SWITCH_ID_6085:
-       case PORT_SWITCH_ID_6185:
-               ps->num_ports = 10;
-               break;
-       case PORT_SWITCH_ID_6095:
-               ps->num_ports = 11;
-               break;
-       case PORT_SWITCH_ID_6131:
-       case PORT_SWITCH_ID_6131_B2:
-               ps->num_ports = 8;
-               break;
-       default:
-               return -ENODEV;
-       }
 
        ret = mv88e6xxx_switch_reset(ps, false);
        if (ret < 0)
diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c
index 0b934b3008ca..8044927590a4 100644
--- a/drivers/net/dsa/mv88e6171.c
+++ b/drivers/net/dsa/mv88e6171.c
@@ -20,10 +20,10 @@
 #include "mv88e6xxx.h"
 
 static const struct mv88e6xxx_switch_id mv88e6171_table[] = {
-       { PORT_SWITCH_ID_6171, "Marvell 88E6171" },
-       { PORT_SWITCH_ID_6175, "Marvell 88E6175" },
-       { PORT_SWITCH_ID_6350, "Marvell 88E6350" },
-       { PORT_SWITCH_ID_6351, "Marvell 88E6351" },
+       { PORT_SWITCH_ID_6171,  "Marvell 88E6171",      7 },
+       { PORT_SWITCH_ID_6175,  "Marvell 88E6175",      7 },
+       { PORT_SWITCH_ID_6350,  "Marvell 88E6350",      7 },
+       { PORT_SWITCH_ID_6351,  "Marvell 88E6351",      7 },
 };
 
 static char *mv88e6171_drv_probe(struct device *dsa_dev,
@@ -85,8 +85,6 @@ static int mv88e6171_setup(struct dsa_switch *ds)
        if (ret < 0)
                return ret;
 
-       ps->num_ports = 7;
-
        ret = mv88e6xxx_switch_reset(ps, true);
        if (ret < 0)
                return ret;
diff --git a/drivers/net/dsa/mv88e6352.c b/drivers/net/dsa/mv88e6352.c
index b745a1f36a1f..e5541cd66e86 100644
--- a/drivers/net/dsa/mv88e6352.c
+++ b/drivers/net/dsa/mv88e6352.c
@@ -24,18 +24,18 @@
 #include "mv88e6xxx.h"
 
 static const struct mv88e6xxx_switch_id mv88e6352_table[] = {
-       { PORT_SWITCH_ID_6172, "Marvell 88E6172" },
-       { PORT_SWITCH_ID_6176, "Marvell 88E6176" },
-       { PORT_SWITCH_ID_6240, "Marvell 88E6240" },
-       { PORT_SWITCH_ID_6320, "Marvell 88E6320" },
-       { PORT_SWITCH_ID_6320_A1, "Marvell 88E6320 (A1)" },
-       { PORT_SWITCH_ID_6320_A2, "Marvell 88e6320 (A2)" },
-       { PORT_SWITCH_ID_6321, "Marvell 88E6321" },
-       { PORT_SWITCH_ID_6321_A1, "Marvell 88E6321 (A1)" },
-       { PORT_SWITCH_ID_6321_A2, "Marvell 88e6321 (A2)" },
-       { PORT_SWITCH_ID_6352, "Marvell 88E6352" },
-       { PORT_SWITCH_ID_6352_A0, "Marvell 88E6352 (A0)" },
-       { PORT_SWITCH_ID_6352_A1, "Marvell 88E6352 (A1)" },
+       { PORT_SWITCH_ID_6172,          "Marvell 88E6172",      7 },
+       { PORT_SWITCH_ID_6176,          "Marvell 88E6176",      7 },
+       { PORT_SWITCH_ID_6240,          "Marvell 88E6240",      7 },
+       { PORT_SWITCH_ID_6320,          "Marvell 88E6320",      7 },
+       { PORT_SWITCH_ID_6320_A1,       "Marvell 88E6320 (A1)", 7 },
+       { PORT_SWITCH_ID_6320_A2,       "Marvell 88e6320 (A2)", 7 },
+       { PORT_SWITCH_ID_6321,          "Marvell 88E6321",      7 },
+       { PORT_SWITCH_ID_6321_A1,       "Marvell 88E6321 (A1)", 7 },
+       { PORT_SWITCH_ID_6321_A2,       "Marvell 88e6321 (A2)", 7 },
+       { PORT_SWITCH_ID_6352,          "Marvell 88E6352",      7 },
+       { PORT_SWITCH_ID_6352_A0,       "Marvell 88E6352 (A0)", 7 },
+       { PORT_SWITCH_ID_6352_A1,       "Marvell 88E6352 (A1)", 7 },
 };
 
 static char *mv88e6352_drv_probe(struct device *dsa_dev,
@@ -95,8 +95,6 @@ static int mv88e6352_setup(struct dsa_switch *ds)
        if (ret < 0)
                return ret;
 
-       ps->num_ports = 7;
-
        mutex_init(&ps->eeprom_mutex);
 
        ret = mv88e6xxx_switch_reset(ps, true);
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index b8db7ed12005..9bf20c6d8aac 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -3206,23 +3206,23 @@ int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, 
bool *alarm)
 EXPORT_SYMBOL_GPL(mv88e6xxx_get_temp_alarm);
 #endif /* CONFIG_NET_DSA_HWMON */
 
-static char *mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr,
-                                  const struct mv88e6xxx_switch_id *table,
-                                  unsigned int num)
+static int mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr,
+                                const struct mv88e6xxx_switch_id *table,
+                                unsigned int num)
 {
        int i, ret;
 
        if (!bus)
-               return NULL;
+               return -EINVAL;
 
        ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID);
        if (ret < 0)
-               return NULL;
+               return ret;
 
        /* Look up the exact switch ID */
        for (i = 0; i < num; ++i)
                if (table[i].id == ret)
-                       return table[i].name;
+                       return i;
 
        /* Look up only the product number */
        for (i = 0; i < num; ++i) {
@@ -3231,11 +3231,11 @@ static char *mv88e6xxx_lookup_name(struct mii_bus *bus, 
int sw_addr,
                                 "unknown revision %d, using base switch 
0x%x\n",
                                 ret & PORT_SWITCH_ID_REV_MASK,
                                 ret & PORT_SWITCH_ID_PROD_NUM_MASK);
-                       return table[i].name;
+                       return i;
                }
        }
 
-       return NULL;
+       return -ENODEV;
 }
 
 char *mv88e6xxx_drv_probe(struct device *dsa_dev, struct device *host_dev,
@@ -3245,13 +3245,14 @@ char *mv88e6xxx_drv_probe(struct device *dsa_dev, 
struct device *host_dev,
 {
        struct mv88e6xxx_priv_state *ps;
        struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
-       char *name;
+       char *name = NULL;
+       int entry;
 
        if (!bus)
                return NULL;
 
-       name = mv88e6xxx_lookup_name(bus, sw_addr, table, num);
-       if (name) {
+       entry = mv88e6xxx_lookup_name(bus, sw_addr, table, num);
+       if (entry >= 0) {
                ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
                if (!ps)
                        return NULL;
@@ -3260,6 +3261,9 @@ char *mv88e6xxx_drv_probe(struct device *dsa_dev, struct 
device *host_dev,
                if (!ps->bus)
                        return NULL;
                ps->sw_addr = sw_addr;
+
+               name = table[entry].name;
+               ps->num_ports = table[entry].num_ports;
        }
        return name;
 }
@@ -3273,6 +3277,7 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev, struct 
dsa_switch_driver *ops,
        struct mv88e6xxx_priv_state *ps;
        struct dsa_switch *ds;
        const char *name;
+       int entry;
        int err;
 
        ds = devm_kzalloc(dev, sizeof(*ds) + sizeof(*ps), GFP_KERNEL);
@@ -3290,11 +3295,13 @@ int mv88e6xxx_probe(struct mdio_device *mdiodev, struct 
dsa_switch_driver *ops,
 
        ds->drv = ops;
 
-       name = mv88e6xxx_lookup_name(ps->bus, ps->sw_addr, table, table_size);
-       if (!name) {
+       entry = mv88e6xxx_lookup_name(ps->bus, ps->sw_addr, table, table_size);
+       if (entry < 0) {
                dev_err(dev, "Failed to find switch");
-               return -ENODEV;
+               return entry;
        }
+       name = table[entry].name;
+       ps->num_ports = table[entry].num_ports;
 
        ps->reset = devm_gpiod_get(&mdiodev->dev, "reset", GPIOD_ASIS);
        err = PTR_ERR(ps->reset);
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index 3f7a432c9050..1621e400ef5b 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -371,6 +371,7 @@
 struct mv88e6xxx_switch_id {
        u16 id;
        char *name;
+       int num_ports;
 };
 
 struct mv88e6xxx_atu_entry {
-- 
2.7.0

Reply via email to