net: phy: marvell-88q2xxx: Fix temperature measurement with reset-gpios
[ Upstream commit a197004cf3c2e6c8cc0695c787a97e62e3229754 ]
When using temperature measurement on Marvell 88Q2XXX devices and the
reset-gpios property is set in DT, the device does a hardware reset when
interface is brought down and up again. That means that the content of
the register MDIO_MMD_PCS_MV_TEMP_SENSOR2 is reset to default and that
leads to permanent deactivation of the temperature measurement, because
activation is done in mv88q2xxx_probe. To fix this move activation of
temperature measurement to mv88q222x_config_init.
Fixes: a557a92e68 ("net: phy: marvell-88q2xxx: add support for temperature sensor")
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Dimitri Fedrau <dima.fedrau@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250118-marvell-88q2xxx-fix-hwmon-v2-1-402e62ba2dcb@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
48cf1415e2
commit
bbd4c81ff6
@@ -95,6 +95,10 @@
|
||||
|
||||
#define MDIO_MMD_PCS_MV_TDR_OFF_CUTOFF 65246
|
||||
|
||||
struct mv88q2xxx_priv {
|
||||
bool enable_temp;
|
||||
};
|
||||
|
||||
struct mmd_val {
|
||||
int devad;
|
||||
u32 regnum;
|
||||
@@ -669,17 +673,12 @@ static const struct hwmon_chip_info mv88q2xxx_hwmon_chip_info = {
|
||||
|
||||
static int mv88q2xxx_hwmon_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct mv88q2xxx_priv *priv = phydev->priv;
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
struct device *hwmon;
|
||||
char *hwmon_name;
|
||||
int ret;
|
||||
|
||||
/* Enable temperature sense */
|
||||
ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_MMD_PCS_MV_TEMP_SENSOR2,
|
||||
MDIO_MMD_PCS_MV_TEMP_SENSOR2_DIS_MASK, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
priv->enable_temp = true;
|
||||
hwmon_name = devm_hwmon_sanitize_name(dev, dev_name(dev));
|
||||
if (IS_ERR(hwmon_name))
|
||||
return PTR_ERR(hwmon_name);
|
||||
@@ -702,6 +701,14 @@ static int mv88q2xxx_hwmon_probe(struct phy_device *phydev)
|
||||
|
||||
static int mv88q2xxx_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct mv88q2xxx_priv *priv;
|
||||
|
||||
priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
phydev->priv = priv;
|
||||
|
||||
return mv88q2xxx_hwmon_probe(phydev);
|
||||
}
|
||||
|
||||
@@ -792,6 +799,18 @@ static int mv88q222x_revb1_revb2_config_init(struct phy_device *phydev)
|
||||
|
||||
static int mv88q222x_config_init(struct phy_device *phydev)
|
||||
{
|
||||
struct mv88q2xxx_priv *priv = phydev->priv;
|
||||
int ret;
|
||||
|
||||
/* Enable temperature sense */
|
||||
if (priv->enable_temp) {
|
||||
ret = phy_modify_mmd(phydev, MDIO_MMD_PCS,
|
||||
MDIO_MMD_PCS_MV_TEMP_SENSOR2,
|
||||
MDIO_MMD_PCS_MV_TEMP_SENSOR2_DIS_MASK, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] == PHY_ID_88Q2220_REVB0)
|
||||
return mv88q222x_revb0_config_init(phydev);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user