123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- From 7199c736aa8cd9c69ae681a9c733408372c2ce76 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <[email protected]>
- Date: Tue, 6 Feb 2024 01:08:04 +0300
- Subject: [PATCH 32/48] net: dsa: mt7530: simplify mt7530_pad_clk_setup()
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- This code is from before this driver was converted to phylink API. Phylink
- deals with the unsupported interface cases before mt7530_pad_clk_setup() is
- run. Therefore, the default case would never run. However, it must be
- defined nonetheless to handle all the remaining enumeration values, the
- phy-modes.
- Switch to if statement for RGMII and return which simplifies the code and
- saves an indent.
- Set P6_INTF_MODE, which is the three least significant bits of the
- MT7530_P6ECR register, to 0 for RGMII even though it will already be 0
- after reset. This is to keep supporting dynamic reconfiguration of the port
- in the case the interface changes from TRGMII to RGMII.
- Disable the TRGMII clocks for all cases. They will be enabled if TRGMII is
- being used.
- Read XTAL after checking for RGMII as it's only needed for the TRGMII
- interface mode.
- Reviewed-by: Daniel Golle <[email protected]>
- Reviewed-by: Russell King (Oracle) <[email protected]>
- Signed-off-by: Arınç ÜNAL <[email protected]>
- Reviewed-by: Vladimir Oltean <[email protected]>
- Link: https://lore.kernel.org/r/20240206-for-netnext-mt7530-improvements-2-v5-3-d7d92a185cb1@arinc9.com
- Signed-off-by: Jakub Kicinski <[email protected]>
- ---
- drivers/net/dsa/mt7530.c | 91 ++++++++++++++++++----------------------
- 1 file changed, 40 insertions(+), 51 deletions(-)
- --- a/drivers/net/dsa/mt7530.c
- +++ b/drivers/net/dsa/mt7530.c
- @@ -404,65 +404,54 @@ static int
- mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
- {
- struct mt7530_priv *priv = ds->priv;
- - u32 ncpo1, ssc_delta, trgint, xtal;
- + u32 ncpo1, ssc_delta, xtal;
-
- - xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
- + /* Disable the MT7530 TRGMII clocks */
- + core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
-
- - switch (interface) {
- - case PHY_INTERFACE_MODE_RGMII:
- - trgint = 0;
- - break;
- - case PHY_INTERFACE_MODE_TRGMII:
- - trgint = 1;
- - if (xtal == HWTRAP_XTAL_25MHZ)
- - ssc_delta = 0x57;
- - else
- - ssc_delta = 0x87;
- - if (priv->id == ID_MT7621) {
- - /* PLL frequency: 125MHz: 1.0GBit */
- - if (xtal == HWTRAP_XTAL_40MHZ)
- - ncpo1 = 0x0640;
- - if (xtal == HWTRAP_XTAL_25MHZ)
- - ncpo1 = 0x0a00;
- - } else { /* PLL frequency: 250MHz: 2.0Gbit */
- - if (xtal == HWTRAP_XTAL_40MHZ)
- - ncpo1 = 0x0c80;
- - if (xtal == HWTRAP_XTAL_25MHZ)
- - ncpo1 = 0x1400;
- - }
- - break;
- - default:
- - dev_err(priv->dev, "xMII interface %d not supported\n",
- - interface);
- - return -EINVAL;
- + if (interface == PHY_INTERFACE_MODE_RGMII) {
- + mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
- + P6_INTF_MODE(0));
- + return 0;
- }
-
- - mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
- - P6_INTF_MODE(trgint));
- + mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK, P6_INTF_MODE(1));
-
- - if (trgint) {
- - /* Disable the MT7530 TRGMII clocks */
- - core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
- -
- - /* Setup the MT7530 TRGMII Tx Clock */
- - core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
- - core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
- - core_write(priv, CORE_PLL_GROUP10, RG_LCDDS_SSC_DELTA(ssc_delta));
- - core_write(priv, CORE_PLL_GROUP11, RG_LCDDS_SSC_DELTA1(ssc_delta));
- - core_write(priv, CORE_PLL_GROUP4,
- - RG_SYSPLL_DDSFBK_EN | RG_SYSPLL_BIAS_EN |
- - RG_SYSPLL_BIAS_LPF_EN);
- - core_write(priv, CORE_PLL_GROUP2,
- - RG_SYSPLL_EN_NORMAL | RG_SYSPLL_VODEN |
- - RG_SYSPLL_POSDIV(1));
- - core_write(priv, CORE_PLL_GROUP7,
- - RG_LCDDS_PCW_NCPO_CHG | RG_LCCDS_C(3) |
- - RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
- + xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
-
- - /* Enable the MT7530 TRGMII clocks */
- - core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
- + if (xtal == HWTRAP_XTAL_25MHZ)
- + ssc_delta = 0x57;
- + else
- + ssc_delta = 0x87;
- +
- + if (priv->id == ID_MT7621) {
- + /* PLL frequency: 125MHz: 1.0GBit */
- + if (xtal == HWTRAP_XTAL_40MHZ)
- + ncpo1 = 0x0640;
- + if (xtal == HWTRAP_XTAL_25MHZ)
- + ncpo1 = 0x0a00;
- + } else { /* PLL frequency: 250MHz: 2.0Gbit */
- + if (xtal == HWTRAP_XTAL_40MHZ)
- + ncpo1 = 0x0c80;
- + if (xtal == HWTRAP_XTAL_25MHZ)
- + ncpo1 = 0x1400;
- }
-
- + /* Setup the MT7530 TRGMII Tx Clock */
- + core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
- + core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
- + core_write(priv, CORE_PLL_GROUP10, RG_LCDDS_SSC_DELTA(ssc_delta));
- + core_write(priv, CORE_PLL_GROUP11, RG_LCDDS_SSC_DELTA1(ssc_delta));
- + core_write(priv, CORE_PLL_GROUP4, RG_SYSPLL_DDSFBK_EN |
- + RG_SYSPLL_BIAS_EN | RG_SYSPLL_BIAS_LPF_EN);
- + core_write(priv, CORE_PLL_GROUP2, RG_SYSPLL_EN_NORMAL |
- + RG_SYSPLL_VODEN | RG_SYSPLL_POSDIV(1));
- + core_write(priv, CORE_PLL_GROUP7, RG_LCDDS_PCW_NCPO_CHG |
- + RG_LCCDS_C(3) | RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
- +
- + /* Enable the MT7530 TRGMII clocks */
- + core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
- +
- return 0;
- }
-
|