Message ID | 20221026074532.109220-3-s-vadapalli@ti.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp113975wru; Wed, 26 Oct 2022 00:47:38 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6ksRVr/T0GmwV6PU9pV7/fGfZGHqs3TbmxVnCXV7zq7/B/eh+LGXQ+tKqArQT9Ja7N9wbd X-Received: by 2002:a05:6402:40cc:b0:462:555e:5f73 with SMTP id z12-20020a05640240cc00b00462555e5f73mr2850936edb.259.1666770458301; Wed, 26 Oct 2022 00:47:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666770458; cv=none; d=google.com; s=arc-20160816; b=MnZWej8JvsRpmP92Kec9AmlKB65u88J2/w02rlj6A+IdlfA2Ji04tfbHig1S6gc5N9 O581Q/t1ra8NNIhFQrMgo5ZyKjMTcThEWvvgtMEi4Zk5T1Re5rjYorzdhxGzMjDXmNqT Z1QRlLSlRhTNu9jb16J7o70jZc13q6OwjtJARM9fIMJ5F1aWHi31lKSG/3lqbHst9QJ3 zwUak8mMErrF5Q9CJkYFYItDR/4SvUpzepXoRcZT3BBdJoj1qMO4M1JbCqXUCLrR4vBt RTlCjNo9RZPtfPC59C9CD7x1Eg7yPJthp7JVR68pic2K5xImnDUvo0cigRJwyXsGBiUI VEOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=FLep20rOiKaqZbwK7WvJmzJJvkAh5DtSNpNrVkz3nGI=; b=GaqQniMjJb0tN7AYAaEBQfkwH+aY4NruU3pHUc+YpJzVaGvHBsFSjBXELTtBfLx7Dq TWRjZjvFNXYgHM/kfkO55WXepulyzVBLHtIr5LSB/3z6Y4/JW/6FDoncz1rmiAdQC66Y 6vjbYgcJZb7oopgLXR0wXBqcIdl2Zgv/rG4faMNc5cb9uWx+eI3PSs1M0ZbGIDION2lq ATNNLXOz9IuHm1b7/aern47RA3aFwUEG5lw+AJ3yAJ1qA8vUZd/+0Fbz70XS5tH/Fbdp n0sce837uKsElsqugR9jMomuaVrHl/i7EAtOdrtG8FHqyanBUASaim2WPwNs2/+ah/hQ X97Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="v/8p1rDh"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id eh19-20020a0564020f9300b004615bea1d62si4143231edb.472.2022.10.26.00.47.13; Wed, 26 Oct 2022 00:47:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="v/8p1rDh"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233335AbiJZHqC (ORCPT <rfc822;pwkd43@gmail.com> + 99 others); Wed, 26 Oct 2022 03:46:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233304AbiJZHpy (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 26 Oct 2022 03:45:54 -0400 Received: from fllv0015.ext.ti.com (fllv0015.ext.ti.com [198.47.19.141]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B02E74B84; Wed, 26 Oct 2022 00:45:53 -0700 (PDT) Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 29Q7jjhL118078; Wed, 26 Oct 2022 02:45:45 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1666770345; bh=FLep20rOiKaqZbwK7WvJmzJJvkAh5DtSNpNrVkz3nGI=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=v/8p1rDhku7jKaOM7l/kykrUxyboswF+kEM8YmvC83FUFSR67honWJ83BsiDMcKkE j49cj2u85cWYFq+sxalfQ495vAoJS+4WX8lArcDBYYeMlx0dKaCzVUwR3O8TKpHE1X LYYP7cP+EudnNi/qDE+DjAQJYNxUPorkW+B7pdiU= Received: from DLEE102.ent.ti.com (dlee102.ent.ti.com [157.170.170.32]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 29Q7jjBB099189 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 26 Oct 2022 02:45:45 -0500 Received: from DLEE115.ent.ti.com (157.170.170.26) by DLEE102.ent.ti.com (157.170.170.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.6; Wed, 26 Oct 2022 02:45:45 -0500 Received: from lelv0326.itg.ti.com (10.180.67.84) by DLEE115.ent.ti.com (157.170.170.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.6 via Frontend Transport; Wed, 26 Oct 2022 02:45:45 -0500 Received: from uda0492258.dhcp.ti.com (ileaxei01-snat.itg.ti.com [10.180.69.5]) by lelv0326.itg.ti.com (8.15.2/8.15.2) with ESMTP id 29Q7jXFl005631; Wed, 26 Oct 2022 02:45:41 -0500 From: Siddharth Vadapalli <s-vadapalli@ti.com> To: <robh+dt@kernel.org>, <lee@kernel.org>, <krzysztof.kozlowski@linaro.org>, <krzysztof.kozlowski+dt@linaro.org>, <kishon@kernel.org>, <vkoul@kernel.org>, <dan.carpenter@oracle.com>, <rogerq@kernel.org> CC: <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-phy@lists.infradead.org>, <linux-arm-kernel@lists.infradead.org>, <s-vadapalli@ti.com> Subject: [PATCH v3 2/3] phy: ti: gmii-sel: Update methods for fetching and using qsgmii main port Date: Wed, 26 Oct 2022 13:15:31 +0530 Message-ID: <20221026074532.109220-3-s-vadapalli@ti.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221026074532.109220-1-s-vadapalli@ti.com> References: <20221026074532.109220-1-s-vadapalli@ti.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747735499915022899?= X-GMAIL-MSGID: =?utf-8?q?1747735499915022899?= |
Series |
Add support to PHY GMII SEL for J721e CPSW9G QSGMII
|
|
Commit Message
Siddharth Vadapalli
Oct. 26, 2022, 7:45 a.m. UTC
The number of QSGMII main ports are specific to the device. TI's J7200 for
which the QSGMII main port property is fetched from the device-tree has
only one QSGMII main port. However, devices like TI's J721e support up to
two QSGMII main ports. Thus, the existing methods for fetching and using
the QSGMII main port are not scalable.
Update the existing methods for handling the QSGMII main ports and its
associated requirements to make it scalable for future devices.
Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
---
drivers/phy/ti/phy-gmii-sel.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
Comments
Hi Siddharth, On 26/10/2022 10:45, Siddharth Vadapalli wrote: > The number of QSGMII main ports are specific to the device. TI's J7200 for > which the QSGMII main port property is fetched from the device-tree has > only one QSGMII main port. However, devices like TI's J721e support up to > two QSGMII main ports. Thus, the existing methods for fetching and using > the QSGMII main port are not scalable. > > Update the existing methods for handling the QSGMII main ports and its > associated requirements to make it scalable for future devices. > > Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com> > --- > drivers/phy/ti/phy-gmii-sel.c | 29 ++++++++++++++++++++++------- > 1 file changed, 22 insertions(+), 7 deletions(-) > > diff --git a/drivers/phy/ti/phy-gmii-sel.c b/drivers/phy/ti/phy-gmii-sel.c > index 0bcfd6d96b4d..c8f30d2e1f46 100644 > --- a/drivers/phy/ti/phy-gmii-sel.c > +++ b/drivers/phy/ti/phy-gmii-sel.c > @@ -50,6 +50,7 @@ struct phy_gmii_sel_soc_data { > const struct reg_field (*regfields)[PHY_GMII_SEL_LAST]; > bool use_of_data; > u64 extra_modes; > + u32 num_qsgmii_main_ports; > }; > > struct phy_gmii_sel_priv { > @@ -213,6 +214,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = { > .use_of_data = true, > .regfields = phy_gmii_sel_fields_am654, > .extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII), > + .num_ports = 4, > + .num_qsgmii_main_ports = 1, > }; > > static const struct of_device_id phy_gmii_sel_id_table[] = { > @@ -378,11 +381,13 @@ static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv) > static int phy_gmii_sel_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > + const struct phy_gmii_sel_soc_data *soc_data; > struct device_node *node = dev->of_node; > const struct of_device_id *of_id; > struct phy_gmii_sel_priv *priv; > u32 main_ports = 1; > int ret; > + u32 i; > > of_id = of_match_node(phy_gmii_sel_id_table, pdev->dev.of_node); > if (!of_id) > @@ -394,16 +399,26 @@ static int phy_gmii_sel_probe(struct platform_device *pdev) > > priv->dev = &pdev->dev; > priv->soc_data = of_id->data; > + soc_data = priv->soc_data; > priv->num_ports = priv->soc_data->num_ports; > - of_property_read_u32(node, "ti,qsgmii-main-ports", &main_ports); > + priv->qsgmii_main_ports = 0; > + > /* > - * Ensure that main_ports is within bounds. If the property > - * ti,qsgmii-main-ports is not mentioned, or the value mentioned > - * is out of bounds, default to 1. > + * Based on the compatible, try to read the appropriate number of > + * QSGMII main ports from the "ti,qsgmii-main-ports" property from > + * the device-tree node. > */ > - if (main_ports < 1 || main_ports > 4) > - main_ports = 1; > - priv->qsgmii_main_ports = PHY_GMII_PORT(main_ports); > + for (i = 0; i < soc_data->num_qsgmii_main_ports; i++) { > + of_property_read_u32_index(node, "ti,qsgmii-main-ports", i, &main_ports); > + /* > + * Ensure that main_ports is within bounds. > + */ > + if (main_ports < 1 || main_ports > soc_data->num_ports) { > + dev_err(dev, "Invalid qsgmii main port provided\n"); nit: This message is a bit misleading if the property does not exist in DT. How about just "Invalid ti,qsgmii-main-ports" > + return -EINVAL; > + } > + priv->qsgmii_main_ports |= PHY_GMII_PORT(main_ports); > + } > > priv->regmap = syscon_node_to_regmap(node->parent); > if (IS_ERR(priv->regmap)) { Reviewed-by: Roger Quadros <rogerq@kernel.org> cheers, -roger
Hello Roger, On 28/10/22 15:53, Roger Quadros wrote: > Hi Siddharth, > > On 26/10/2022 10:45, Siddharth Vadapalli wrote: >> The number of QSGMII main ports are specific to the device. TI's J7200 for >> which the QSGMII main port property is fetched from the device-tree has >> only one QSGMII main port. However, devices like TI's J721e support up to >> two QSGMII main ports. Thus, the existing methods for fetching and using >> the QSGMII main port are not scalable. >> >> Update the existing methods for handling the QSGMII main ports and its >> associated requirements to make it scalable for future devices. >> >> Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com> >> --- >> drivers/phy/ti/phy-gmii-sel.c | 29 ++++++++++++++++++++++------- >> 1 file changed, 22 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/phy/ti/phy-gmii-sel.c b/drivers/phy/ti/phy-gmii-sel.c >> index 0bcfd6d96b4d..c8f30d2e1f46 100644 >> --- a/drivers/phy/ti/phy-gmii-sel.c >> +++ b/drivers/phy/ti/phy-gmii-sel.c >> @@ -50,6 +50,7 @@ struct phy_gmii_sel_soc_data { >> const struct reg_field (*regfields)[PHY_GMII_SEL_LAST]; >> bool use_of_data; >> u64 extra_modes; >> + u32 num_qsgmii_main_ports; >> }; >> >> struct phy_gmii_sel_priv { >> @@ -213,6 +214,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = { >> .use_of_data = true, >> .regfields = phy_gmii_sel_fields_am654, >> .extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII), >> + .num_ports = 4, >> + .num_qsgmii_main_ports = 1, >> }; >> >> static const struct of_device_id phy_gmii_sel_id_table[] = { >> @@ -378,11 +381,13 @@ static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv) >> static int phy_gmii_sel_probe(struct platform_device *pdev) >> { >> struct device *dev = &pdev->dev; >> + const struct phy_gmii_sel_soc_data *soc_data; >> struct device_node *node = dev->of_node; >> const struct of_device_id *of_id; >> struct phy_gmii_sel_priv *priv; >> u32 main_ports = 1; >> int ret; >> + u32 i; >> >> of_id = of_match_node(phy_gmii_sel_id_table, pdev->dev.of_node); >> if (!of_id) >> @@ -394,16 +399,26 @@ static int phy_gmii_sel_probe(struct platform_device *pdev) >> >> priv->dev = &pdev->dev; >> priv->soc_data = of_id->data; >> + soc_data = priv->soc_data; >> priv->num_ports = priv->soc_data->num_ports; >> - of_property_read_u32(node, "ti,qsgmii-main-ports", &main_ports); >> + priv->qsgmii_main_ports = 0; >> + >> /* >> - * Ensure that main_ports is within bounds. If the property >> - * ti,qsgmii-main-ports is not mentioned, or the value mentioned >> - * is out of bounds, default to 1. >> + * Based on the compatible, try to read the appropriate number of >> + * QSGMII main ports from the "ti,qsgmii-main-ports" property from >> + * the device-tree node. >> */ >> - if (main_ports < 1 || main_ports > 4) >> - main_ports = 1; >> - priv->qsgmii_main_ports = PHY_GMII_PORT(main_ports); >> + for (i = 0; i < soc_data->num_qsgmii_main_ports; i++) { >> + of_property_read_u32_index(node, "ti,qsgmii-main-ports", i, &main_ports); >> + /* >> + * Ensure that main_ports is within bounds. >> + */ >> + if (main_ports < 1 || main_ports > soc_data->num_ports) { >> + dev_err(dev, "Invalid qsgmii main port provided\n"); > > nit: This message is a bit misleading if the property does not exist in DT. > > How about just "Invalid ti,qsgmii-main-ports" Thank you for reviewing the patch. The variable "main_ports" has been initialized to 1 at the top. Thus, the only way the error condition is entered is if "ti,qsgmii-main-ports" is mentioned in the device-tree with an invalid value. If "ti,qsgmii-main-ports" is not mentioned in the device-tree, then "main_ports" continues being 1, since the function "of_property_read_u32_index()" does not modify "main_ports" if "ti,qsgmii-main-ports" is not present in the device-tree. Thus, in this case, the error condition isn't reached. Regards, Siddharth.
On 28/10/2022 13:32, Siddharth Vadapalli wrote: > Hello Roger, > > On 28/10/22 15:53, Roger Quadros wrote: >> Hi Siddharth, >> >> On 26/10/2022 10:45, Siddharth Vadapalli wrote: >>> The number of QSGMII main ports are specific to the device. TI's J7200 for >>> which the QSGMII main port property is fetched from the device-tree has >>> only one QSGMII main port. However, devices like TI's J721e support up to >>> two QSGMII main ports. Thus, the existing methods for fetching and using >>> the QSGMII main port are not scalable. >>> >>> Update the existing methods for handling the QSGMII main ports and its >>> associated requirements to make it scalable for future devices. >>> >>> Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com> >>> --- >>> drivers/phy/ti/phy-gmii-sel.c | 29 ++++++++++++++++++++++------- >>> 1 file changed, 22 insertions(+), 7 deletions(-) >>> >>> diff --git a/drivers/phy/ti/phy-gmii-sel.c b/drivers/phy/ti/phy-gmii-sel.c >>> index 0bcfd6d96b4d..c8f30d2e1f46 100644 >>> --- a/drivers/phy/ti/phy-gmii-sel.c >>> +++ b/drivers/phy/ti/phy-gmii-sel.c >>> @@ -50,6 +50,7 @@ struct phy_gmii_sel_soc_data { >>> const struct reg_field (*regfields)[PHY_GMII_SEL_LAST]; >>> bool use_of_data; >>> u64 extra_modes; >>> + u32 num_qsgmii_main_ports; >>> }; >>> >>> struct phy_gmii_sel_priv { >>> @@ -213,6 +214,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = { >>> .use_of_data = true, >>> .regfields = phy_gmii_sel_fields_am654, >>> .extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII), >>> + .num_ports = 4, >>> + .num_qsgmii_main_ports = 1, >>> }; >>> >>> static const struct of_device_id phy_gmii_sel_id_table[] = { >>> @@ -378,11 +381,13 @@ static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv) >>> static int phy_gmii_sel_probe(struct platform_device *pdev) >>> { >>> struct device *dev = &pdev->dev; >>> + const struct phy_gmii_sel_soc_data *soc_data; >>> struct device_node *node = dev->of_node; >>> const struct of_device_id *of_id; >>> struct phy_gmii_sel_priv *priv; >>> u32 main_ports = 1; >>> int ret; >>> + u32 i; >>> >>> of_id = of_match_node(phy_gmii_sel_id_table, pdev->dev.of_node); >>> if (!of_id) >>> @@ -394,16 +399,26 @@ static int phy_gmii_sel_probe(struct platform_device *pdev) >>> >>> priv->dev = &pdev->dev; >>> priv->soc_data = of_id->data; >>> + soc_data = priv->soc_data; >>> priv->num_ports = priv->soc_data->num_ports; >>> - of_property_read_u32(node, "ti,qsgmii-main-ports", &main_ports); >>> + priv->qsgmii_main_ports = 0; >>> + >>> /* >>> - * Ensure that main_ports is within bounds. If the property >>> - * ti,qsgmii-main-ports is not mentioned, or the value mentioned >>> - * is out of bounds, default to 1. >>> + * Based on the compatible, try to read the appropriate number of >>> + * QSGMII main ports from the "ti,qsgmii-main-ports" property from >>> + * the device-tree node. >>> */ >>> - if (main_ports < 1 || main_ports > 4) >>> - main_ports = 1; >>> - priv->qsgmii_main_ports = PHY_GMII_PORT(main_ports); >>> + for (i = 0; i < soc_data->num_qsgmii_main_ports; i++) { >>> + of_property_read_u32_index(node, "ti,qsgmii-main-ports", i, &main_ports); >>> + /* >>> + * Ensure that main_ports is within bounds. >>> + */ >>> + if (main_ports < 1 || main_ports > soc_data->num_ports) { >>> + dev_err(dev, "Invalid qsgmii main port provided\n"); >> >> nit: This message is a bit misleading if the property does not exist in DT. >> >> How about just "Invalid ti,qsgmii-main-ports" > > Thank you for reviewing the patch. The variable "main_ports" has been > initialized to 1 at the top. Thus, the only way the error condition is > entered is if "ti,qsgmii-main-ports" is mentioned in the device-tree > with an invalid value. If "ti,qsgmii-main-ports" is not mentioned in the > device-tree, then "main_ports" continues being 1, since the function > "of_property_read_u32_index()" does not modify "main_ports" if > "ti,qsgmii-main-ports" is not present in the device-tree. Thus, in this > case, the error condition isn't reached. You are right. No need to change the message in that case. cheers, -roger
diff --git a/drivers/phy/ti/phy-gmii-sel.c b/drivers/phy/ti/phy-gmii-sel.c index 0bcfd6d96b4d..c8f30d2e1f46 100644 --- a/drivers/phy/ti/phy-gmii-sel.c +++ b/drivers/phy/ti/phy-gmii-sel.c @@ -50,6 +50,7 @@ struct phy_gmii_sel_soc_data { const struct reg_field (*regfields)[PHY_GMII_SEL_LAST]; bool use_of_data; u64 extra_modes; + u32 num_qsgmii_main_ports; }; struct phy_gmii_sel_priv { @@ -213,6 +214,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = { .use_of_data = true, .regfields = phy_gmii_sel_fields_am654, .extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII), + .num_ports = 4, + .num_qsgmii_main_ports = 1, }; static const struct of_device_id phy_gmii_sel_id_table[] = { @@ -378,11 +381,13 @@ static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv) static int phy_gmii_sel_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; + const struct phy_gmii_sel_soc_data *soc_data; struct device_node *node = dev->of_node; const struct of_device_id *of_id; struct phy_gmii_sel_priv *priv; u32 main_ports = 1; int ret; + u32 i; of_id = of_match_node(phy_gmii_sel_id_table, pdev->dev.of_node); if (!of_id) @@ -394,16 +399,26 @@ static int phy_gmii_sel_probe(struct platform_device *pdev) priv->dev = &pdev->dev; priv->soc_data = of_id->data; + soc_data = priv->soc_data; priv->num_ports = priv->soc_data->num_ports; - of_property_read_u32(node, "ti,qsgmii-main-ports", &main_ports); + priv->qsgmii_main_ports = 0; + /* - * Ensure that main_ports is within bounds. If the property - * ti,qsgmii-main-ports is not mentioned, or the value mentioned - * is out of bounds, default to 1. + * Based on the compatible, try to read the appropriate number of + * QSGMII main ports from the "ti,qsgmii-main-ports" property from + * the device-tree node. */ - if (main_ports < 1 || main_ports > 4) - main_ports = 1; - priv->qsgmii_main_ports = PHY_GMII_PORT(main_ports); + for (i = 0; i < soc_data->num_qsgmii_main_ports; i++) { + of_property_read_u32_index(node, "ti,qsgmii-main-ports", i, &main_ports); + /* + * Ensure that main_ports is within bounds. + */ + if (main_ports < 1 || main_ports > soc_data->num_ports) { + dev_err(dev, "Invalid qsgmii main port provided\n"); + return -EINVAL; + } + priv->qsgmii_main_ports |= PHY_GMII_PORT(main_ports); + } priv->regmap = syscon_node_to_regmap(node->parent); if (IS_ERR(priv->regmap)) {