123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- From f932a6dc8bae0dae9645b5b1b4c65aed8a8acb2a Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- 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 <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- 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;
|