mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	Copy backport, hack, pending patch and config from 6.1 to 6.6. Signed-off-by: Weijie Gao <hackpascal@gmail.com>
		
			
				
	
	
		
			298 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From f932a6dc8bae0dae9645b5b1b4c65aed8a8acb2a Mon Sep 17 00:00:00 2001
 | 
						|
From: Christian Marangi <ansuelsmth@gmail.com>
 | 
						|
Date: Fri, 8 Dec 2023 15:51:58 +0100
 | 
						|
Subject: [PATCH 11/13] net: phy: at803x: move at8031 functions in dedicated
 | 
						|
 section
 | 
						|
 | 
						|
Move at8031 functions in dedicated section with dedicated at8031
 | 
						|
parse_dt and probe.
 | 
						|
 | 
						|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | 
						|
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
						|
---
 | 
						|
 drivers/net/phy/at803x.c | 266 +++++++++++++++++++--------------------
 | 
						|
 1 file changed, 133 insertions(+), 133 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/net/phy/at803x.c
 | 
						|
+++ b/drivers/net/phy/at803x.c
 | 
						|
@@ -583,139 +583,6 @@ static int at803x_resume(struct phy_devi
 | 
						|
 	return phy_modify(phydev, MII_BMCR, BMCR_PDOWN | BMCR_ISOLATE, 0);
 | 
						|
 }
 | 
						|
 
 | 
						|
-static int at8031_rgmii_reg_set_voltage_sel(struct regulator_dev *rdev,
 | 
						|
-					    unsigned int selector)
 | 
						|
-{
 | 
						|
-	struct phy_device *phydev = rdev_get_drvdata(rdev);
 | 
						|
-
 | 
						|
-	if (selector)
 | 
						|
-		return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_1F,
 | 
						|
-					     0, AT803X_DEBUG_RGMII_1V8);
 | 
						|
-	else
 | 
						|
-		return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_1F,
 | 
						|
-					     AT803X_DEBUG_RGMII_1V8, 0);
 | 
						|
-}
 | 
						|
-
 | 
						|
-static int at8031_rgmii_reg_get_voltage_sel(struct regulator_dev *rdev)
 | 
						|
-{
 | 
						|
-	struct phy_device *phydev = rdev_get_drvdata(rdev);
 | 
						|
-	int val;
 | 
						|
-
 | 
						|
-	val = at803x_debug_reg_read(phydev, AT803X_DEBUG_REG_1F);
 | 
						|
-	if (val < 0)
 | 
						|
-		return val;
 | 
						|
-
 | 
						|
-	return (val & AT803X_DEBUG_RGMII_1V8) ? 1 : 0;
 | 
						|
-}
 | 
						|
-
 | 
						|
-static const struct regulator_ops vddio_regulator_ops = {
 | 
						|
-	.list_voltage = regulator_list_voltage_table,
 | 
						|
-	.set_voltage_sel = at8031_rgmii_reg_set_voltage_sel,
 | 
						|
-	.get_voltage_sel = at8031_rgmii_reg_get_voltage_sel,
 | 
						|
-};
 | 
						|
-
 | 
						|
-static const unsigned int vddio_voltage_table[] = {
 | 
						|
-	1500000,
 | 
						|
-	1800000,
 | 
						|
-};
 | 
						|
-
 | 
						|
-static const struct regulator_desc vddio_desc = {
 | 
						|
-	.name = "vddio",
 | 
						|
-	.of_match = of_match_ptr("vddio-regulator"),
 | 
						|
-	.n_voltages = ARRAY_SIZE(vddio_voltage_table),
 | 
						|
-	.volt_table = vddio_voltage_table,
 | 
						|
-	.ops = &vddio_regulator_ops,
 | 
						|
-	.type = REGULATOR_VOLTAGE,
 | 
						|
-	.owner = THIS_MODULE,
 | 
						|
-};
 | 
						|
-
 | 
						|
-static const struct regulator_ops vddh_regulator_ops = {
 | 
						|
-};
 | 
						|
-
 | 
						|
-static const struct regulator_desc vddh_desc = {
 | 
						|
-	.name = "vddh",
 | 
						|
-	.of_match = of_match_ptr("vddh-regulator"),
 | 
						|
-	.n_voltages = 1,
 | 
						|
-	.fixed_uV = 2500000,
 | 
						|
-	.ops = &vddh_regulator_ops,
 | 
						|
-	.type = REGULATOR_VOLTAGE,
 | 
						|
-	.owner = THIS_MODULE,
 | 
						|
-};
 | 
						|
-
 | 
						|
-static int at8031_register_regulators(struct phy_device *phydev)
 | 
						|
-{
 | 
						|
-	struct at803x_priv *priv = phydev->priv;
 | 
						|
-	struct device *dev = &phydev->mdio.dev;
 | 
						|
-	struct regulator_config config = { };
 | 
						|
-
 | 
						|
-	config.dev = dev;
 | 
						|
-	config.driver_data = phydev;
 | 
						|
-
 | 
						|
-	priv->vddio_rdev = devm_regulator_register(dev, &vddio_desc, &config);
 | 
						|
-	if (IS_ERR(priv->vddio_rdev)) {
 | 
						|
-		phydev_err(phydev, "failed to register VDDIO regulator\n");
 | 
						|
-		return PTR_ERR(priv->vddio_rdev);
 | 
						|
-	}
 | 
						|
-
 | 
						|
-	priv->vddh_rdev = devm_regulator_register(dev, &vddh_desc, &config);
 | 
						|
-	if (IS_ERR(priv->vddh_rdev)) {
 | 
						|
-		phydev_err(phydev, "failed to register VDDH regulator\n");
 | 
						|
-		return PTR_ERR(priv->vddh_rdev);
 | 
						|
-	}
 | 
						|
-
 | 
						|
-	return 0;
 | 
						|
-}
 | 
						|
-
 | 
						|
-static int at8031_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
 | 
						|
-{
 | 
						|
-	struct phy_device *phydev = upstream;
 | 
						|
-	__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support);
 | 
						|
-	__ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support);
 | 
						|
-	DECLARE_PHY_INTERFACE_MASK(interfaces);
 | 
						|
-	phy_interface_t iface;
 | 
						|
-
 | 
						|
-	linkmode_zero(phy_support);
 | 
						|
-	phylink_set(phy_support, 1000baseX_Full);
 | 
						|
-	phylink_set(phy_support, 1000baseT_Full);
 | 
						|
-	phylink_set(phy_support, Autoneg);
 | 
						|
-	phylink_set(phy_support, Pause);
 | 
						|
-	phylink_set(phy_support, Asym_Pause);
 | 
						|
-
 | 
						|
-	linkmode_zero(sfp_support);
 | 
						|
-	sfp_parse_support(phydev->sfp_bus, id, sfp_support, interfaces);
 | 
						|
-	/* Some modules support 10G modes as well as others we support.
 | 
						|
-	 * Mask out non-supported modes so the correct interface is picked.
 | 
						|
-	 */
 | 
						|
-	linkmode_and(sfp_support, phy_support, sfp_support);
 | 
						|
-
 | 
						|
-	if (linkmode_empty(sfp_support)) {
 | 
						|
-		dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
 | 
						|
-		return -EINVAL;
 | 
						|
-	}
 | 
						|
-
 | 
						|
-	iface = sfp_select_interface(phydev->sfp_bus, sfp_support);
 | 
						|
-
 | 
						|
-	/* Only 1000Base-X is supported by AR8031/8033 as the downstream SerDes
 | 
						|
-	 * interface for use with SFP modules.
 | 
						|
-	 * However, some copper modules detected as having a preferred SGMII
 | 
						|
-	 * interface do default to and function in 1000Base-X mode, so just
 | 
						|
-	 * print a warning and allow such modules, as they may have some chance
 | 
						|
-	 * of working.
 | 
						|
-	 */
 | 
						|
-	if (iface == PHY_INTERFACE_MODE_SGMII)
 | 
						|
-		dev_warn(&phydev->mdio.dev, "module may not function if 1000Base-X not supported\n");
 | 
						|
-	else if (iface != PHY_INTERFACE_MODE_1000BASEX)
 | 
						|
-		return -EINVAL;
 | 
						|
-
 | 
						|
-	return 0;
 | 
						|
-}
 | 
						|
-
 | 
						|
-static const struct sfp_upstream_ops at8031_sfp_ops = {
 | 
						|
-	.attach = phy_sfp_attach,
 | 
						|
-	.detach = phy_sfp_detach,
 | 
						|
-	.module_insert = at8031_sfp_insert,
 | 
						|
-};
 | 
						|
-
 | 
						|
 static int at803x_parse_dt(struct phy_device *phydev)
 | 
						|
 {
 | 
						|
 	struct device_node *node = phydev->mdio.dev.of_node;
 | 
						|
@@ -1498,6 +1365,139 @@ static int at803x_cable_test_start(struc
 | 
						|
 	return 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
+static int at8031_rgmii_reg_set_voltage_sel(struct regulator_dev *rdev,
 | 
						|
+					    unsigned int selector)
 | 
						|
+{
 | 
						|
+	struct phy_device *phydev = rdev_get_drvdata(rdev);
 | 
						|
+
 | 
						|
+	if (selector)
 | 
						|
+		return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_1F,
 | 
						|
+					     0, AT803X_DEBUG_RGMII_1V8);
 | 
						|
+	else
 | 
						|
+		return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_1F,
 | 
						|
+					     AT803X_DEBUG_RGMII_1V8, 0);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int at8031_rgmii_reg_get_voltage_sel(struct regulator_dev *rdev)
 | 
						|
+{
 | 
						|
+	struct phy_device *phydev = rdev_get_drvdata(rdev);
 | 
						|
+	int val;
 | 
						|
+
 | 
						|
+	val = at803x_debug_reg_read(phydev, AT803X_DEBUG_REG_1F);
 | 
						|
+	if (val < 0)
 | 
						|
+		return val;
 | 
						|
+
 | 
						|
+	return (val & AT803X_DEBUG_RGMII_1V8) ? 1 : 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static const struct regulator_ops vddio_regulator_ops = {
 | 
						|
+	.list_voltage = regulator_list_voltage_table,
 | 
						|
+	.set_voltage_sel = at8031_rgmii_reg_set_voltage_sel,
 | 
						|
+	.get_voltage_sel = at8031_rgmii_reg_get_voltage_sel,
 | 
						|
+};
 | 
						|
+
 | 
						|
+static const unsigned int vddio_voltage_table[] = {
 | 
						|
+	1500000,
 | 
						|
+	1800000,
 | 
						|
+};
 | 
						|
+
 | 
						|
+static const struct regulator_desc vddio_desc = {
 | 
						|
+	.name = "vddio",
 | 
						|
+	.of_match = of_match_ptr("vddio-regulator"),
 | 
						|
+	.n_voltages = ARRAY_SIZE(vddio_voltage_table),
 | 
						|
+	.volt_table = vddio_voltage_table,
 | 
						|
+	.ops = &vddio_regulator_ops,
 | 
						|
+	.type = REGULATOR_VOLTAGE,
 | 
						|
+	.owner = THIS_MODULE,
 | 
						|
+};
 | 
						|
+
 | 
						|
+static const struct regulator_ops vddh_regulator_ops = {
 | 
						|
+};
 | 
						|
+
 | 
						|
+static const struct regulator_desc vddh_desc = {
 | 
						|
+	.name = "vddh",
 | 
						|
+	.of_match = of_match_ptr("vddh-regulator"),
 | 
						|
+	.n_voltages = 1,
 | 
						|
+	.fixed_uV = 2500000,
 | 
						|
+	.ops = &vddh_regulator_ops,
 | 
						|
+	.type = REGULATOR_VOLTAGE,
 | 
						|
+	.owner = THIS_MODULE,
 | 
						|
+};
 | 
						|
+
 | 
						|
+static int at8031_register_regulators(struct phy_device *phydev)
 | 
						|
+{
 | 
						|
+	struct at803x_priv *priv = phydev->priv;
 | 
						|
+	struct device *dev = &phydev->mdio.dev;
 | 
						|
+	struct regulator_config config = { };
 | 
						|
+
 | 
						|
+	config.dev = dev;
 | 
						|
+	config.driver_data = phydev;
 | 
						|
+
 | 
						|
+	priv->vddio_rdev = devm_regulator_register(dev, &vddio_desc, &config);
 | 
						|
+	if (IS_ERR(priv->vddio_rdev)) {
 | 
						|
+		phydev_err(phydev, "failed to register VDDIO regulator\n");
 | 
						|
+		return PTR_ERR(priv->vddio_rdev);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	priv->vddh_rdev = devm_regulator_register(dev, &vddh_desc, &config);
 | 
						|
+	if (IS_ERR(priv->vddh_rdev)) {
 | 
						|
+		phydev_err(phydev, "failed to register VDDH regulator\n");
 | 
						|
+		return PTR_ERR(priv->vddh_rdev);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int at8031_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
 | 
						|
+{
 | 
						|
+	struct phy_device *phydev = upstream;
 | 
						|
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support);
 | 
						|
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support);
 | 
						|
+	DECLARE_PHY_INTERFACE_MASK(interfaces);
 | 
						|
+	phy_interface_t iface;
 | 
						|
+
 | 
						|
+	linkmode_zero(phy_support);
 | 
						|
+	phylink_set(phy_support, 1000baseX_Full);
 | 
						|
+	phylink_set(phy_support, 1000baseT_Full);
 | 
						|
+	phylink_set(phy_support, Autoneg);
 | 
						|
+	phylink_set(phy_support, Pause);
 | 
						|
+	phylink_set(phy_support, Asym_Pause);
 | 
						|
+
 | 
						|
+	linkmode_zero(sfp_support);
 | 
						|
+	sfp_parse_support(phydev->sfp_bus, id, sfp_support, interfaces);
 | 
						|
+	/* Some modules support 10G modes as well as others we support.
 | 
						|
+	 * Mask out non-supported modes so the correct interface is picked.
 | 
						|
+	 */
 | 
						|
+	linkmode_and(sfp_support, phy_support, sfp_support);
 | 
						|
+
 | 
						|
+	if (linkmode_empty(sfp_support)) {
 | 
						|
+		dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
 | 
						|
+		return -EINVAL;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	iface = sfp_select_interface(phydev->sfp_bus, sfp_support);
 | 
						|
+
 | 
						|
+	/* Only 1000Base-X is supported by AR8031/8033 as the downstream SerDes
 | 
						|
+	 * interface for use with SFP modules.
 | 
						|
+	 * However, some copper modules detected as having a preferred SGMII
 | 
						|
+	 * interface do default to and function in 1000Base-X mode, so just
 | 
						|
+	 * print a warning and allow such modules, as they may have some chance
 | 
						|
+	 * of working.
 | 
						|
+	 */
 | 
						|
+	if (iface == PHY_INTERFACE_MODE_SGMII)
 | 
						|
+		dev_warn(&phydev->mdio.dev, "module may not function if 1000Base-X not supported\n");
 | 
						|
+	else if (iface != PHY_INTERFACE_MODE_1000BASEX)
 | 
						|
+		return -EINVAL;
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static const struct sfp_upstream_ops at8031_sfp_ops = {
 | 
						|
+	.attach = phy_sfp_attach,
 | 
						|
+	.detach = phy_sfp_detach,
 | 
						|
+	.module_insert = at8031_sfp_insert,
 | 
						|
+};
 | 
						|
+
 | 
						|
 static int at8031_parse_dt(struct phy_device *phydev)
 | 
						|
 {
 | 
						|
 	struct device_node *node = phydev->mdio.dev.of_node;
 |