mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
Merge tag 'phy-qcom-sgmii-eth-add-set_mode-and-validate-methods'
net: stmmac: qcom-ethqos: further serdes reorganisation [part] First PHY patch of Russell's series. Vladimir will need this to avoid a conflict with his work. Link: https://patch.msgid.link/aaDSJAc-x2-klvHJ@shell.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
@@ -286,6 +287,37 @@ 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)
|
||||
{
|
||||
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;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
speed = qcom_dwmac_sgmii_phy_speed(mode, submode);
|
||||
if (speed < 0)
|
||||
return speed;
|
||||
|
||||
if (speed != data->speed)
|
||||
data->speed = speed;
|
||||
|
||||
return qcom_dwmac_sgmii_phy_calibrate(phy);
|
||||
}
|
||||
|
||||
static int qcom_dwmac_sgmii_phy_set_speed(struct phy *phy, int speed)
|
||||
{
|
||||
struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
|
||||
@@ -296,10 +328,21 @@ static int qcom_dwmac_sgmii_phy_set_speed(struct phy *phy, int speed)
|
||||
return qcom_dwmac_sgmii_phy_calibrate(phy);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
static const struct phy_ops qcom_dwmac_sgmii_phy_ops = {
|
||||
.power_on = qcom_dwmac_sgmii_phy_power_on,
|
||||
.power_off = qcom_dwmac_sgmii_phy_power_off,
|
||||
.set_mode = qcom_dwmac_sgmii_phy_set_mode,
|
||||
.set_speed = qcom_dwmac_sgmii_phy_set_speed,
|
||||
.validate = qcom_dwmac_sgmii_phy_validate,
|
||||
.calibrate = qcom_dwmac_sgmii_phy_calibrate,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user