#define MAX310X_GLOBALCMD_REG          MAX310X_REG_1F /* Global Command (WO) */
 
 /* Extended registers */
-#define MAX310X_REVID_EXTREG           MAX310X_REG_05 /* Revision ID */
+#define MAX310X_SPI_REVID_EXTREG       MAX310X_REG_05 /* Revision ID */
 
 /* IRQ register bits */
 #define MAX310X_IRQ_LSR_BIT            (1 << 0) /* LSR interrupt */
 #define MAX14830_BRGCFG_CLKDIS_BIT     (1 << 6) /* Clock Disable */
 #define MAX14830_REV_ID                        (0xb0)
 
+struct max310x_if_cfg {
+       int (*extended_reg_enable)(struct device *dev, bool enable);
+
+       unsigned int rev_id_reg;
+};
+
 struct max310x_devtype {
        char    name[9];
        int     nr;
 
 struct max310x_port {
        const struct max310x_devtype *devtype;
+       const struct max310x_if_cfg *if_cfg;
        struct regmap           *regmap;
        struct clk              *clk;
 #ifdef CONFIG_GPIOLIB
        unsigned int val = 0;
        int ret;
 
-       ret = regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
-                          MAX310X_EXTREG_ENBL);
+       ret = s->if_cfg->extended_reg_enable(dev, true);
        if (ret)
                return ret;
 
-       regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val);
-       regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL);
+       regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val);
+       s->if_cfg->extended_reg_enable(dev, false);
        if (((val & MAX310x_REV_MASK) != MAX3109_REV_ID)) {
                dev_err(dev,
                        "%s ID 0x%02x does not match\n", s->devtype->name, val);
        unsigned int val = 0;
        int ret;
 
-       ret = regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
-                          MAX310X_EXTREG_ENBL);
+       ret = s->if_cfg->extended_reg_enable(dev, true);
        if (ret)
                return ret;
        
-       regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val);
-       regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL);
+       regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val);
+       s->if_cfg->extended_reg_enable(dev, false);
        if (((val & MAX310x_REV_MASK) != MAX14830_REV_ID)) {
                dev_err(dev,
                        "%s ID 0x%02x does not match\n", s->devtype->name, val);
 #endif
 
 static int max310x_probe(struct device *dev, const struct max310x_devtype *devtype,
+                        const struct max310x_if_cfg *if_cfg,
                         struct regmap *regmaps[], int irq)
 {
        int i, ret, fmin, fmax, freq;
 
        s->regmap = regmaps[0];
        s->devtype = devtype;
+       s->if_cfg = if_cfg;
        dev_set_drvdata(dev, s);
 
        /* Check device to ensure we are talking to what we expect */
 };
 
 #ifdef CONFIG_SPI_MASTER
+static int max310x_spi_extended_reg_enable(struct device *dev, bool enable)
+{
+       struct max310x_port *s = dev_get_drvdata(dev);
+
+       return regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
+                           enable ? MAX310X_EXTREG_ENBL : MAX310X_EXTREG_DSBL);
+}
+
+static const struct max310x_if_cfg __maybe_unused max310x_spi_if_cfg = {
+       .extended_reg_enable = max310x_spi_extended_reg_enable,
+       .rev_id_reg = MAX310X_SPI_REVID_EXTREG,
+};
+
 static int max310x_spi_probe(struct spi_device *spi)
 {
        const struct max310x_devtype *devtype;
                regmaps[i] = devm_regmap_init_spi(spi, ®cfg);
        }
 
-       return max310x_probe(&spi->dev, devtype, regmaps, spi->irq);
+       return max310x_probe(&spi->dev, devtype, &max310x_spi_if_cfg, regmaps, spi->irq);
 }
 
 static void max310x_spi_remove(struct spi_device *spi)