Commit f5ada26d authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents 01857fc7 4ff5801f
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -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,
};