phy: ti: j721e-wiz: Do not configure wiz if its already configured
authorFaiz Abbas <faiz_abbas@ti.com>
Tue, 30 Mar 2021 11:01:34 +0000 (16:31 +0530)
committerVinod Koul <vkoul@kernel.org>
Wed, 31 Mar 2021 11:15:47 +0000 (16:45 +0530)
Serdes lanes might be shared between multiple cores in some usecases
and its not possible to lock PLLs for both the lanes independently
by the two cores. This requires a bootloader to configure both the
lanes at early boot time.

To handle this case, skip all configuration if any of the lanes has
already been enabled.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Link: https://lore.kernel.org/r/20210330110138.24356-2-kishon@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/ti/phy-j721e-wiz.c

index 02c47b2..2523805 100644 (file)
@@ -1134,13 +1134,14 @@ static int wiz_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->of_node;
        struct platform_device *serdes_pdev;
+       bool already_configured = false;
        struct device_node *child_node;
        struct regmap *regmap;
        struct resource res;
        void __iomem *base;
        struct wiz *wiz;
+       int ret, val, i;
        u32 num_lanes;
-       int ret;
 
        wiz = devm_kzalloc(dev, sizeof(*wiz), GFP_KERNEL);
        if (!wiz)
@@ -1268,10 +1269,20 @@ static int wiz_probe(struct platform_device *pdev)
                goto err_get_sync;
        }
 
-       ret = wiz_init(wiz);
-       if (ret) {
-               dev_err(dev, "WIZ initialization failed\n");
-               goto err_wiz_init;
+       for (i = 0; i < wiz->num_lanes; i++) {
+               regmap_field_read(wiz->p_enable[i], &val);
+               if (val & (P_ENABLE | P_ENABLE_FORCE)) {
+                       already_configured = true;
+                       break;
+               }
+       }
+
+       if (!already_configured) {
+               ret = wiz_init(wiz);
+               if (ret) {
+                       dev_err(dev, "WIZ initialization failed\n");
+                       goto err_wiz_init;
+               }
        }
 
        serdes_pdev = of_platform_device_create(child_node, NULL, dev);