[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
<BY3PR18MB47076A26714A7AC5A34D7F32A0A1A@BY3PR18MB4707.namprd18.prod.outlook.com>
Date: Thu, 11 Dec 2025 18:39:28 +0000
From: Sai Krishna Gajula <saikrishnag@...vell.com>
To: Marek Vasut <marek.vasut@...lbox.org>,
"netdev@...r.kernel.org"
<netdev@...r.kernel.org>
CC: "David S. Miller" <davem@...emloft.net>,
Aleksander Jan Bajkowski
<olek2@...pl>, Andrew Lunn <andrew@...n.ch>,
Conor Dooley
<conor+dt@...nel.org>,
Eric Dumazet <edumazet@...gle.com>,
Florian Fainelli
<f.fainelli@...il.com>,
Heiner Kallweit <hkallweit1@...il.com>,
Ivan Galkin
<ivan.galkin@...s.com>, Jakub Kicinski <kuba@...nel.org>,
Krzysztof Kozlowski
<krzk+dt@...nel.org>,
Michael Klein <michael@...sekall.de>, Paolo Abeni
<pabeni@...hat.com>,
Rob Herring <robh@...nel.org>, Russell King
<linux@...linux.org.uk>,
Vladimir Oltean <vladimir.oltean@....com>,
"devicetree@...r.kernel.org" <devicetree@...r.kernel.org>
Subject: RE: [net-next,PATCH v2 3/3] net: phy: realtek: Add property to enable
SSC
> -----Original Message-----
> From: Marek Vasut <marek.vasut@...lbox.org>
> Sent: Thursday, December 4, 2025 2:38 AM
> To: netdev@...r.kernel.org
> Cc: Marek Vasut <marek.vasut@...lbox.org>; David S. Miller
> <davem@...emloft.net>; Aleksander Jan Bajkowski <olek2@...pl>; Andrew
> Lunn <andrew@...n.ch>; Conor Dooley <conor+dt@...nel.org>; Eric
> Dumazet <edumazet@...gle.com>; Florian Fainelli <f.fainelli@...il.com>;
> Heiner Kallweit <hkallweit1@...il.com>; Ivan Galkin
> <ivan.galkin@...s.com>; Jakub Kicinski <kuba@...nel.org>; Krzysztof
> Kozlowski <krzk+dt@...nel.org>; Michael Klein <michael@...sekall.de>;
> Paolo Abeni <pabeni@...hat.com>; Rob Herring <robh@...nel.org>; Russell
> King <linux@...linux.org.uk>; Vladimir Oltean <vladimir.oltean@....com>;
> devicetree@...r.kernel.org
> Subject: [net-next,PATCH v2 3/3] net: phy: realtek: Add property
> to enable SSC
>
> Add support for spread spectrum clocking (SSC) on RTL8211F(D)(I)-CG,
> RTL8211FS(I)(-VS)-CG, RTL8211FG(I)(-VS)-CG PHYs. The implementation
> follows EMI improvement application note Rev. 1. 2 for these PHYs. The
> current implementation enables SSC
> Add support for spread spectrum clocking (SSC) on RTL8211F(D)(I)-CG,
> RTL8211FS(I)(-VS)-CG, RTL8211FG(I)(-VS)-CG PHYs. The implementation
> follows EMI improvement application note Rev. 1.2 for these PHYs.
>
> The current implementation enables SSC for both RXC and SYSCLK clock
> signals. Introduce DT properties 'realtek,clkout-ssc-enable', 'realtek,rxc-ssc-
> enable' and 'realtek,sysclk-ssc-enable' which control CLKOUT, RXC and SYSCLK
> SSC spread spectrum clocking enablement on these signals.
>
> Signed-off-by: Marek Vasut <marek.vasut@...lbox.org>
> ---
> Cc: "David S. Miller" <davem@...emloft.net>
> Cc: Aleksander Jan Bajkowski <olek2@...pl>
> Cc: Andrew Lunn <andrew@...n.ch>
> Cc: Conor Dooley <conor+dt@...nel.org>
> Cc: Eric Dumazet <edumazet@...gle.com>
> Cc: Florian Fainelli <f.fainelli@...il.com>
> Cc: Heiner Kallweit <hkallweit1@...il.com>
> Cc: Ivan Galkin <ivan.galkin@...s.com>
> Cc: Jakub Kicinski <kuba@...nel.org>
> Cc: Krzysztof Kozlowski <krzk+dt@...nel.org>
> Cc: Michael Klein <michael@...sekall.de>
> Cc: Paolo Abeni <pabeni@...hat.com>
> Cc: Rob Herring <robh@...nel.org>
> Cc: Russell King <linux@...linux.org.uk>
> Cc: Vladimir Oltean <vladimir.oltean@....com>
> Cc: devicetree@...r.kernel.org
> Cc: netdev@...r.kernel.org
> ---
> V2: Split SSC clock control for each CLKOUT, RXC, SYSCLK signal
> ---
> drivers/net/phy/realtek/realtek_main.c | 124 +++++++++++++++++++++++++
> 1 file changed, 124 insertions(+)
>
> diff --git a/drivers/net/phy/realtek/realtek_main.c
> b/drivers/net/phy/realtek/realtek_main.c
> index 67ecf3d4af2b1..ac80653cdbe28 100644
> --- a/drivers/net/phy/realtek/realtek_main.c
> +++ b/drivers/net/phy/realtek/realtek_main.c
> @@ -74,11 +74,19 @@
>
> #define RTL8211F_PHYCR2 0x19
> #define RTL8211F_CLKOUT_EN BIT(0)
> +#define RTL8211F_SYSCLK_SSC_EN BIT(3)
> #define RTL8211F_PHYCR2_PHY_EEE_ENABLE BIT(5)
> +#define RTL8211F_CLKOUT_SSC_EN BIT(7)
>
> #define RTL8211F_INSR_PAGE 0xa43
> #define RTL8211F_INSR 0x1d
>
> +/* RTL8211F SSC settings */
> +#define RTL8211F_SSC_PAGE 0xc44
> +#define RTL8211F_SSC_RXC 0x13
> +#define RTL8211F_SSC_SYSCLK 0x17
> +#define RTL8211F_SSC_CLKOUT 0x19
> +
> /* RTL8211F LED configuration */
> #define RTL8211F_LEDCR_PAGE 0xd04
> #define RTL8211F_LEDCR 0x10
> @@ -203,6 +211,9 @@ MODULE_LICENSE("GPL"); struct rtl821x_priv {
> bool enable_aldps;
> bool disable_clk_out;
> + bool enable_clkout_ssc;
> + bool enable_rxc_ssc;
> + bool enable_sysclk_ssc;
> struct clk *clk;
> /* rtl8211f */
> u16 iner;
> @@ -266,6 +277,12 @@ static int rtl821x_probe(struct phy_device *phydev)
> "realtek,aldps-enable");
> priv->disable_clk_out = of_property_read_bool(dev->of_node,
> "realtek,clkout-disable");
> + priv->enable_clkout_ssc = of_property_read_bool(dev->of_node,
> + "realtek,clkout-ssc-
> enable");
> + priv->enable_rxc_ssc = of_property_read_bool(dev->of_node,
> + "realtek,rxc-ssc-enable");
> + priv->enable_sysclk_ssc = of_property_read_bool(dev->of_node,
> + "realtek,sysclk-ssc-
> enable");
>
> phydev->priv = priv;
>
> @@ -700,6 +717,101 @@ static int rtl8211f_config_phy_eee(struct
> phy_device *phydev)
> RTL8211F_PHYCR2_PHY_EEE_ENABLE, 0); }
>
> +static int rtl8211f_config_clkout_ssc(struct phy_device *phydev) {
> + struct rtl821x_priv *priv = phydev->priv;
> + struct device *dev = &phydev->mdio.dev;
> + int ret;
> +
> + /* The value is preserved if the device tree property is absent */
> + if (!priv->enable_clkout_ssc)
> + return 0;
> +
> + /* RTL8211FVD has no PHYCR2 register */
> + if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> + return 0;
> +
> + /* Unnamed registers from EMI improvement parameters application
> note 1.2 */
> + ret = phy_write_paged(phydev, 0xd09, 0x10, 0xcf00);
> + if (ret < 0) {
> + dev_err(dev, "CLKOUT SCC initialization failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_CLKOUT, 0x38c3);
> + if (ret < 0) {
> + dev_err(dev, "CLKOUT SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + /*
> + * Enable CLKOUT SSC using PHYCR2 bit 7 , this step is missing from
> the
> + * EMI improvement parameters application note 1.2 section 2.3
> + */
> + ret = phy_modify_paged(phydev, RTL8211F_PHYCR_PAGE,
> RTL8211F_PHYCR2,
> + RTL8211F_CLKOUT_SSC_EN,
> RTL8211F_CLKOUT_SSC_EN);
> + if (ret < 0) {
> + dev_err(dev, "CLKOUT SCC enable failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int rtl8211f_config_rxc_ssc(struct phy_device *phydev) {
> + struct rtl821x_priv *priv = phydev->priv;
> + struct device *dev = &phydev->mdio.dev;
> + int ret;
> +
> + /* The value is preserved if the device tree property is absent */
> + if (!priv->enable_rxc_ssc)
> + return 0;
> +
> + /* RTL8211FVD has no PHYCR2 register */
> + if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> + return 0;
> +
> + ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_RXC, 0x5f00);
> + if (ret < 0) {
> + dev_err(dev, "RXC SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int rtl8211f_config_sysclk_ssc(struct phy_device *phydev) {
Minor nit: Kernel style requires the opening brace on the next line, also in other places.
static int rtl8211f_config_sysclk_ssc(struct phy_device *phydev)
{
> + struct rtl821x_priv *priv = phydev->priv;
> + struct device *dev = &phydev->mdio.dev;
> + int ret;
> +
> + /* The value is preserved if the device tree property is absent */
> + if (!priv->enable_sysclk_ssc)
> + return 0;
> +
> + /* RTL8211FVD has no PHYCR2 register */
> + if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> + return 0;
> +
> + ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_SYSCLK, 0x4f00);
> + if (ret < 0) {
> + dev_err(dev, "SYSCLK SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + /* Enable SSC */
> + ret = phy_modify_paged(phydev, RTL8211F_PHYCR_PAGE,
> RTL8211F_PHYCR2,
> + RTL8211F_SYSCLK_SSC_EN,
> RTL8211F_SYSCLK_SSC_EN);
> + if (ret < 0) {
> + dev_err(dev, "SYSCLK SCC enable failed: %pe\n",
> ERR_PTR(ret));
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> static int rtl8211f_config_init(struct phy_device *phydev) {
> struct device *dev = &phydev->mdio.dev; @@ -723,6 +835,18 @@
> static int rtl8211f_config_init(struct phy_device *phydev)
> return ret;
> }
>
> + ret = rtl8211f_config_clkout_ssc(phydev);
> + if (ret)
> + return ret;
> +
> + ret = rtl8211f_config_rxc_ssc(phydev);
> + if (ret)
> + return ret;
> +
> + ret = rtl8211f_config_sysclk_ssc(phydev);
> + if (ret)
> + return ret;
> +
> return rtl8211f_config_phy_eee(phydev); }
>
> --
> 2.51.0
>
Powered by blists - more mailing lists