phy: cadence-torrent: Check total lane count for all subnodes is within limit
authorSwapnil Jakhade <sjakhade@cadence.com>
Wed, 16 Sep 2020 18:28:29 +0000 (20:28 +0200)
committerVinod Koul <vkoul@kernel.org>
Fri, 18 Sep 2020 05:04:47 +0000 (10:34 +0530)
Add checking if total number of lanes for all subnodes is not greater than
number of lanes supported by PHY.

Signed-off-by: Swapnil Jakhade <sjakhade@cadence.com>
Link: https://lore.kernel.org/r/1600280911-9214-6-git-send-email-sjakhade@cadence.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/cadence/phy-cadence-torrent.c

index 9dba7ba..6c19940 100644 (file)
@@ -25,7 +25,6 @@
 #define REF_CLK_19_2MHz                19200000
 #define REF_CLK_25MHz          25000000
 
-#define DEFAULT_NUM_LANES      4
 #define MAX_NUM_LANES          4
 #define DEFAULT_MAX_BIT_RATE   8100 /* in Mbps */
 
@@ -1734,6 +1733,7 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev)
        const struct cdns_torrent_data *data;
        struct device_node *child;
        int ret, subnodes, node = 0, i;
+       u32 total_num_lanes = 0;
        u8 init_dp_regmap = 0;
 
        /* Get init data for this PHY */
@@ -1808,9 +1808,15 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev)
                        goto put_child;
                }
 
-               cdns_phy->phys[node].num_lanes = DEFAULT_NUM_LANES;
-               of_property_read_u32(child, "cdns,num-lanes",
-                                    &cdns_phy->phys[node].num_lanes);
+               if (of_property_read_u32(child, "cdns,num-lanes",
+                                        &cdns_phy->phys[node].num_lanes)) {
+                       dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n",
+                               child->full_name);
+                       ret = -EINVAL;
+                       goto put_child;
+               }
+
+               total_num_lanes += cdns_phy->phys[node].num_lanes;
 
                if (cdns_phy->phys[node].phy_type == PHY_TYPE_DP) {
                        switch (cdns_phy->phys[node].num_lanes) {
@@ -1890,6 +1896,11 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev)
        }
        cdns_phy->nsubnodes = node;
 
+       if (total_num_lanes > MAX_NUM_LANES) {
+               dev_err(dev, "Invalid lane configuration\n");
+               goto put_lnk_rst;
+       }
+
        phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
        if (IS_ERR(phy_provider)) {
                ret = PTR_ERR(phy_provider);