mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
phy: qcom-sgmii-eth: use PHY interface mode for SerDes settings
As established in the previous commit, using SPEED_1000 and SPEED_2500 does not make sense for a SerDes due to the PCS encoding that is used over the SerDes link, which inflates the data rate at the SerDes. Thus, the use of these constants in a SerDes driver is incorrect. Since qcom-sgmii-eth no longer implements phy_set_speed(), but instead uses the PHY interface mode passed via the .set_mode() method, convert the driver to use the PHY interface mode internally to decide whether to configure the SerDes for 1.25Gbps or 3.125Gbps mode. Tested-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com> Acked-by: Vinod Koul <vkoul@kernel.org> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Link: https://patch.msgid.link/E1vxS4E-0000000BQXg-46dJ@rmk-PC.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b772159754
commit
d2b20acdae
|
|
@ -29,7 +29,7 @@
|
|||
struct qcom_dwmac_sgmii_phy_data {
|
||||
struct regmap *regmap;
|
||||
struct clk *refclk;
|
||||
int speed;
|
||||
phy_interface_t interface;
|
||||
};
|
||||
|
||||
static void qcom_dwmac_sgmii_phy_init_1g(struct regmap *regmap)
|
||||
|
|
@ -223,15 +223,18 @@ static int qcom_dwmac_sgmii_phy_calibrate(struct phy *phy)
|
|||
struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
|
||||
struct device *dev = phy->dev.parent;
|
||||
|
||||
switch (data->speed) {
|
||||
case SPEED_10:
|
||||
case SPEED_100:
|
||||
case SPEED_1000:
|
||||
switch (data->interface) {
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
case PHY_INTERFACE_MODE_1000BASEX:
|
||||
/* 1.25Gbps mode */
|
||||
qcom_dwmac_sgmii_phy_init_1g(data->regmap);
|
||||
break;
|
||||
case SPEED_2500:
|
||||
case PHY_INTERFACE_MODE_2500BASEX:
|
||||
/* 3.125Gbps mode */
|
||||
qcom_dwmac_sgmii_phy_init_2p5g(data->regmap);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (qcom_dwmac_sgmii_phy_poll_status(data->regmap,
|
||||
|
|
@ -287,17 +290,15 @@ static int qcom_dwmac_sgmii_phy_power_off(struct phy *phy)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int qcom_dwmac_sgmii_phy_speed(enum phy_mode mode, int submode)
|
||||
static int qcom_dwmac_sgmii_phy_interface(enum phy_mode mode, int submode)
|
||||
{
|
||||
if (mode != PHY_MODE_ETHERNET)
|
||||
return -EINVAL;
|
||||
|
||||
if (submode == PHY_INTERFACE_MODE_SGMII ||
|
||||
submode == PHY_INTERFACE_MODE_1000BASEX)
|
||||
return SPEED_1000;
|
||||
|
||||
if (submode == PHY_INTERFACE_MODE_2500BASEX)
|
||||
return SPEED_2500;
|
||||
submode == PHY_INTERFACE_MODE_1000BASEX ||
|
||||
submode == PHY_INTERFACE_MODE_2500BASEX)
|
||||
return submode;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -306,14 +307,14 @@ static int qcom_dwmac_sgmii_phy_set_mode(struct phy *phy, enum phy_mode mode,
|
|||
int submode)
|
||||
{
|
||||
struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
|
||||
int speed;
|
||||
int interface;
|
||||
|
||||
speed = qcom_dwmac_sgmii_phy_speed(mode, submode);
|
||||
if (speed < 0)
|
||||
return speed;
|
||||
interface = qcom_dwmac_sgmii_phy_interface(mode, submode);
|
||||
if (interface < 0)
|
||||
return interface;
|
||||
|
||||
if (speed != data->speed)
|
||||
data->speed = speed;
|
||||
if (interface != data->interface)
|
||||
data->interface = interface;
|
||||
|
||||
return qcom_dwmac_sgmii_phy_calibrate(phy);
|
||||
}
|
||||
|
|
@ -322,7 +323,7 @@ static int qcom_dwmac_sgmii_phy_validate(struct phy *phy, enum phy_mode mode,
|
|||
int submode,
|
||||
union phy_configure_opts *opts)
|
||||
{
|
||||
int ret = qcom_dwmac_sgmii_phy_speed(mode, submode);
|
||||
int ret = qcom_dwmac_sgmii_phy_interface(mode, submode);
|
||||
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
|
@ -356,7 +357,7 @@ static int qcom_dwmac_sgmii_phy_probe(struct platform_device *pdev)
|
|||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
data->speed = SPEED_10;
|
||||
data->interface = PHY_INTERFACE_MODE_SGMII;
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user