phy: stm32-usbphyc: stm32: usbphyc: add protection on phy sub-node
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Tue, 14 Sep 2021 12:31:17 +0000 (14:31 +0200)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 8 Oct 2021 06:19:59 +0000 (08:19 +0200)
Add protection on presence and order of the phy node sub node
by using the mandatory reg information.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
drivers/phy/phy-stm32-usbphyc.c

index c206efd..9c1dcfa 100644 (file)
@@ -340,7 +340,7 @@ static int stm32_usbphyc_probe(struct udevice *dev)
        struct stm32_usbphyc *usbphyc = dev_get_priv(dev);
        struct reset_ctl reset;
        ofnode node, connector;
-       int i, ret;
+       int ret;
 
        usbphyc->base = dev_read_addr(dev);
        if (usbphyc->base == FDT_ADDR_T_NONE)
@@ -378,14 +378,18 @@ static int stm32_usbphyc_probe(struct udevice *dev)
                return ret;
        }
 
-       /*
-        * parse all PHY subnodes in order to populate regulator associated
-        * to each PHY port
-        */
-       node = dev_read_first_subnode(dev);
-       for (i = 0; i < MAX_PHYS; i++) {
-               struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + i;
+       /* parse all PHY subnodes to populate regulator associated to each PHY port */
+       dev_for_each_subnode(node, dev) {
+               fdt_addr_t phy_id;
+               struct stm32_usbphyc_phy *usbphyc_phy;
 
+               phy_id = ofnode_read_u32_default(node, "reg", FDT_ADDR_T_NONE);
+               if (phy_id >= MAX_PHYS) {
+                       dev_err(dev, "invalid reg value %lx for %s\n",
+                               phy_id, ofnode_get_name(node));
+                       return -ENOENT;
+               }
+               usbphyc_phy = usbphyc->phys + phy_id;
                usbphyc_phy->init = false;
                usbphyc_phy->powered = false;
                ret = stm32_usbphyc_get_regulator(node, "phy-supply",
@@ -401,8 +405,6 @@ static int stm32_usbphyc_probe(struct udevice *dev)
                        ret = stm32_usbphyc_get_regulator(connector, "vbus-supply",
                                                          &usbphyc_phy->vbus);
                }
-
-               node = dev_read_next_subnode(node);
        }
 
        /* Check if second port has to be used for host controller */