regmap: Rework regmap_mdio_c45_{read|write} for new C45 API.
authorAndrew Lunn <andrew@lunn.ch>
Mon, 16 Jan 2023 11:15:09 +0000 (12:15 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 16 Jan 2023 13:16:09 +0000 (13:16 +0000)
The MDIO subsystem is getting rid of MII_ADDR_C45 and thus also
encoding associated encoding of the C45 device address and register
address into one value. regmap-mdio also uses this encoding for the
C45 bus.

Move to the new C45 helpers for MDIO access and provide regmap-mdio
helper macros.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Michael Walle <michael@walle.cc>
Link: https://lore.kernel.org/r/20230116111509.4086236-1-michael@walle.cc
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/regmap-mdio.c
include/linux/regmap.h

index f7293040a2b18ac15f2c27f5c4a1ac9fb5985020..6aa6a2409478fa7a376d9368cf5f85f9fd67412a 100644 (file)
 /* Clause-45 mask includes the device type (5 bit) and actual register number (16 bit) */
 #define REGNUM_C45_MASK                GENMASK(20, 0)
 
-static int regmap_mdio_read(struct mdio_device *mdio_dev, u32 reg, unsigned int *val)
+static int regmap_mdio_c22_read(void *context, unsigned int reg, unsigned int *val)
 {
+       struct mdio_device *mdio_dev = context;
        int ret;
 
+       if (unlikely(reg & ~REGNUM_C22_MASK))
+               return -ENXIO;
+
        ret = mdiodev_read(mdio_dev, reg);
        if (ret < 0)
                return ret;
 
        *val = ret & REGVAL_MASK;
-       return 0;
-}
-
-static int regmap_mdio_write(struct mdio_device *mdio_dev, u32 reg, unsigned int val)
-{
-       return mdiodev_write(mdio_dev, reg, val);
-}
-
-static int regmap_mdio_c22_read(void *context, unsigned int reg, unsigned int *val)
-{
-       struct mdio_device *mdio_dev = context;
-
-       if (unlikely(reg & ~REGNUM_C22_MASK))
-               return -ENXIO;
 
-       return regmap_mdio_read(mdio_dev, reg, val);
+       return 0;
 }
 
 static int regmap_mdio_c22_write(void *context, unsigned int reg, unsigned int val)
@@ -55,21 +45,36 @@ static const struct regmap_bus regmap_mdio_c22_bus = {
 static int regmap_mdio_c45_read(void *context, unsigned int reg, unsigned int *val)
 {
        struct mdio_device *mdio_dev = context;
+       unsigned int devad;
+       int ret;
 
        if (unlikely(reg & ~REGNUM_C45_MASK))
                return -ENXIO;
 
-       return regmap_mdio_read(mdio_dev, MII_ADDR_C45 | reg, val);
+       devad = reg >> REGMAP_MDIO_C45_DEVAD_SHIFT;
+       reg = reg & REGMAP_MDIO_C45_REGNUM_MASK;
+
+       ret = mdiodev_c45_read(mdio_dev, devad, reg);
+       if (ret < 0)
+               return ret;
+
+       *val = ret & REGVAL_MASK;
+
+       return 0;
 }
 
 static int regmap_mdio_c45_write(void *context, unsigned int reg, unsigned int val)
 {
        struct mdio_device *mdio_dev = context;
+       unsigned int devad;
 
        if (unlikely(reg & ~REGNUM_C45_MASK))
                return -ENXIO;
 
-       return regmap_mdio_write(mdio_dev, MII_ADDR_C45 | reg, val);
+       devad = reg >> REGMAP_MDIO_C45_DEVAD_SHIFT;
+       reg = reg & REGMAP_MDIO_C45_REGNUM_MASK;
+
+       return mdiodev_c45_write(mdio_dev, devad, reg, val);
 }
 
 static const struct regmap_bus regmap_mdio_c45_bus = {
index a3bc695bcca09b7fa42415e852667939fc8c379d..029b9e09d3cae260a91e140c0f466d4978c72728 100644 (file)
@@ -38,6 +38,14 @@ struct regmap_field;
 struct snd_ac97;
 struct sdw_slave;
 
+/*
+ * regmap_mdio address encoding. IEEE 802.3ae clause 45 addresses consist of a
+ * device address and a register address.
+ */
+#define REGMAP_MDIO_C45_DEVAD_SHIFT    16
+#define REGMAP_MDIO_C45_DEVAD_MASK     GENMASK(20, 16)
+#define REGMAP_MDIO_C45_REGNUM_MASK    GENMASK(15, 0)
+
 /* An enum of all the supported cache types */
 enum regcache_type {
        REGCACHE_NONE,