Messages in this thread |  | | Date | Mon, 1 Dec 2025 17:29:36 -0500 | | From | Frank Li <> | | Subject | Re: [PATCH 1/4] net: stmmac: s32: use the syscon interface PHY_INTF_SEL_RGMII |
| |
On Mon, Dec 01, 2025 at 04:08:20PM +0300, Dan Carpenter wrote: > On the s32 chipset the GMAC_0_CTRL_STS register is in GPR region. > Originally, accessing this register was done in a sort of ad-hoc way, > but we want to use the syscon interface to do it.
What's benefit by use syscon interface here? syscon have not much well consided funcitonal abstraction.
Frank
> > This is a little bit uglier because we to maintain backwards compatibility > to the old device trees so we have to support both ways to access this > register. > > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > .../net/ethernet/stmicro/stmmac/dwmac-s32.c | 23 +++++++++++++++---- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c > index 5a485ee98fa7..20de761b7d28 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c > @@ -11,12 +11,14 @@ > #include <linux/device.h> > #include <linux/ethtool.h> > #include <linux/io.h> > +#include <linux/mfd/syscon.h> > #include <linux/module.h> > #include <linux/of_mdio.h> > #include <linux/of_address.h> > #include <linux/phy.h> > #include <linux/phylink.h> > #include <linux/platform_device.h> > +#include <linux/regmap.h> > #include <linux/stmmac.h> > > #include "stmmac_platform.h" > @@ -32,6 +34,8 @@ > struct s32_priv_data { > void __iomem *ioaddr; > void __iomem *ctrl_sts; > + struct regmap *sts_regmap; > + unsigned int sts_offset; > struct device *dev; > phy_interface_t *intf_mode; > struct clk *tx_clk; > @@ -40,7 +44,10 @@ struct s32_priv_data { > > static int s32_gmac_write_phy_intf_select(struct s32_priv_data *gmac) > { > - writel(S32_PHY_INTF_SEL_RGMII, gmac->ctrl_sts); > + if (gmac->ctrl_sts) > + writel(S32_PHY_INTF_SEL_RGMII, gmac->ctrl_sts); > + else > + regmap_write(gmac->sts_regmap, gmac->sts_offset, PHY_INTF_SEL_RGMII); > > dev_dbg(gmac->dev, "PHY mode set to %s\n", phy_modes(*gmac->intf_mode)); > > @@ -125,10 +132,16 @@ static int s32_dwmac_probe(struct platform_device *pdev) > "dt configuration failed\n"); > > /* PHY interface mode control reg */ > - gmac->ctrl_sts = devm_platform_get_and_ioremap_resource(pdev, 1, NULL); > - if (IS_ERR(gmac->ctrl_sts)) > - return dev_err_probe(dev, PTR_ERR(gmac->ctrl_sts), > - "S32CC config region is missing\n"); > + gmac->sts_regmap = syscon_regmap_lookup_by_phandle_args(dev->of_node, > + "phy-sel", 1, &gmac->sts_offset); > + if (gmac->sts_regmap == ERR_PTR(-EPROBE_DEFER)) > + return PTR_ERR(gmac->sts_regmap); > + if (IS_ERR(gmac->sts_regmap)) { > + gmac->ctrl_sts = devm_platform_get_and_ioremap_resource(pdev, 1, NULL); > + if (IS_ERR(gmac->ctrl_sts)) > + return dev_err_probe(dev, PTR_ERR(gmac->ctrl_sts), > + "S32CC config region is missing\n"); > + } > > /* tx clock */ > gmac->tx_clk = devm_clk_get(&pdev->dev, "tx"); > -- > 2.51.0 >
|  |