]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
phy: phy-ocelot-serdes: add ability to be used in a non-syscon configuration
authorColin Foster <colin.foster@in-advantage.com>
Fri, 17 Mar 2023 18:54:07 +0000 (11:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Mar 2023 09:08:48 +0000 (09:08 +0000)
The phy-ocelot-serdes module has exclusively been used in a syscon setup,
from an internal CPU. The addition of external control of ocelot switches
via an existing MFD implementation means that syscon is no longer the only
interface that phy-ocelot-serdes will see.

In the MFD configuration, an IORESOURCE_REG resource will exist for the
device. Utilize this resource to be able to function in both syscon and
non-syscon configurations.

Signed-off-by: Colin Foster <colin.foster@in-advantage.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/phy/mscc/phy-ocelot-serdes.c

index 76f59636517616708885acf177e21558e7cc4ec9..d9443e865a780f11ec03105e373f2bcf9bded8aa 100644 (file)
@@ -494,6 +494,7 @@ static int serdes_probe(struct platform_device *pdev)
 {
        struct phy_provider *provider;
        struct serdes_ctrl *ctrl;
+       struct resource *res;
        unsigned int i;
        int ret;
 
@@ -503,6 +504,14 @@ static int serdes_probe(struct platform_device *pdev)
 
        ctrl->dev = &pdev->dev;
        ctrl->regs = syscon_node_to_regmap(pdev->dev.parent->of_node);
+       if (IS_ERR(ctrl->regs)) {
+               /* Fall back to using IORESOURCE_REG, if possible */
+               res = platform_get_resource(pdev, IORESOURCE_REG, 0);
+               if (res)
+                       ctrl->regs = dev_get_regmap(ctrl->dev->parent,
+                                                   res->name);
+       }
+
        if (IS_ERR(ctrl->regs))
                return PTR_ERR(ctrl->regs);