of how to define a PHY.
 
 Required properties:
-  - reg : Offset and length of the register set for the device
+  - reg : Offset and length of the register set for the device, and optionally
+          the offset and length of the TBIPA register (TBI PHY address
+         register).  If TBIPA register is not specified, the driver will
+         attempt to infer it from the register set specified (your mileage may
+         vary).
   - compatible : Should define the compatible device type for the
     mdio. Currently supported strings/devices are:
        - "fsl,gianfar-tbi"
 
 };
 MODULE_DEVICE_TABLE(of, fsl_pq_mdio_match);
 
+static void set_tbipa(const u32 tbipa_val, struct platform_device *pdev,
+                     uint32_t __iomem * (*get_tbipa)(void __iomem *),
+                     void __iomem *reg_map, struct resource *reg_res)
+{
+       struct device_node *np = pdev->dev.of_node;
+       uint32_t __iomem *tbipa;
+       bool tbipa_mapped;
+
+       tbipa = of_iomap(np, 1);
+       if (tbipa) {
+               tbipa_mapped = true;
+       } else {
+               tbipa_mapped = false;
+               tbipa = (*get_tbipa)(reg_map);
+
+               /*
+                * Add consistency check to make sure TBI is contained within
+                * the mapped range (not because we would get a segfault,
+                * rather to catch bugs in computing TBI address). Print error
+                * message but continue anyway.
+                */
+               if ((void *)tbipa > reg_map + resource_size(reg_res) - 4)
+                       dev_err(&pdev->dev, "invalid register map (should be at least 0x%04zx to contain TBI address)\n",
+                               ((void *)tbipa - reg_map) + 4);
+       }
+
+       iowrite32be(be32_to_cpu(tbipa_val), tbipa);
+
+       if (tbipa_mapped)
+               iounmap(tbipa);
+}
+
 static int fsl_pq_mdio_probe(struct platform_device *pdev)
 {
        const struct of_device_id *id =
 
                if (tbi) {
                        const u32 *prop = of_get_property(tbi, "reg", NULL);
-                       uint32_t __iomem *tbipa;
-
                        if (!prop) {
                                dev_err(&pdev->dev,
                                        "missing 'reg' property in node %pOF\n",
                                err = -EBUSY;
                                goto error;
                        }
-
-                       tbipa = data->get_tbipa(priv->map);
-
-                       /*
-                        * Add consistency check to make sure TBI is contained
-                        * within the mapped range (not because we would get a
-                        * segfault, rather to catch bugs in computing TBI
-                        * address). Print error message but continue anyway.
-                        */
-                       if ((void *)tbipa > priv->map + resource_size(&res) - 4)
-                               dev_err(&pdev->dev, "invalid register map (should be at least 0x%04zx to contain TBI address)\n",
-                                       ((void *)tbipa - priv->map) + 4);
-
-                       iowrite32be(be32_to_cpup(prop), tbipa);
+                       set_tbipa(*prop, pdev,
+                                 data->get_tbipa, priv->map, &res);
                }
        }