]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: phy: marvell-88q2xxx: Enable temperature measurement in probe again
authorDimitri Fedrau <dima.fedrau@gmail.com>
Mon, 12 May 2025 12:03:42 +0000 (14:03 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 15 May 2025 10:32:09 +0000 (12:32 +0200)
Enabling of the temperature sensor was moved from mv88q2xxx_hwmon_probe to
mv88q222x_config_init with the consequence that the sensor is only
usable when the PHY is configured. Enable the sensor in
mv88q2xxx_hwmon_probe as well to fix this.

Signed-off-by: Dimitri Fedrau <dima.fedrau@gmail.com>
Link: https://patch.msgid.link/20250512-marvell-88q2xxx-hwmon-enable-at-probe-v4-1-9256a5c8f603@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/marvell-88q2xxx.c

index 5c687164b8e068f3f09e91cd4dd198f24782682e..f3d83b04c9535c78091a2491d3d551d4d340d130 100644 (file)
 #define MV88Q2XXX_LED_INDEX_GPIO                       1
 
 struct mv88q2xxx_priv {
-       bool enable_temp;
        bool enable_led0;
 };
 
@@ -482,49 +481,6 @@ static int mv88q2xxx_config_aneg(struct phy_device *phydev)
        return phydev->drv->soft_reset(phydev);
 }
 
-static int mv88q2xxx_config_init(struct phy_device *phydev)
-{
-       struct mv88q2xxx_priv *priv = phydev->priv;
-       int ret;
-
-       /* The 88Q2XXX PHYs do have the extended ability register available, but
-        * register MDIO_PMA_EXTABLE where they should signalize it does not
-        * work according to specification. Therefore, we force it here.
-        */
-       phydev->pma_extable = MDIO_PMA_EXTABLE_BT1;
-
-       /* Configure interrupt with default settings, output is driven low for
-        * active interrupt and high for inactive.
-        */
-       if (phy_interrupt_is_valid(phydev)) {
-               ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS,
-                                      MDIO_MMD_PCS_MV_GPIO_INT_CTRL,
-                                      MDIO_MMD_PCS_MV_GPIO_INT_CTRL_TRI_DIS);
-               if (ret < 0)
-                       return ret;
-       }
-
-       /* Enable LED function and disable TX disable feature on LED/TX_ENABLE */
-       if (priv->enable_led0) {
-               ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PCS,
-                                        MDIO_MMD_PCS_MV_RESET_CTRL,
-                                        MDIO_MMD_PCS_MV_RESET_CTRL_TX_DISABLE);
-               if (ret < 0)
-                       return 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;
-       }
-
-       return 0;
-}
-
 static int mv88q2xxx_get_sqi(struct phy_device *phydev)
 {
        int ret;
@@ -667,6 +623,12 @@ static int mv88q2xxx_resume(struct phy_device *phydev)
 }
 
 #if IS_ENABLED(CONFIG_HWMON)
+static int mv88q2xxx_enable_temp_sense(struct phy_device *phydev)
+{
+       return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_MMD_PCS_MV_TEMP_SENSOR2,
+                             MDIO_MMD_PCS_MV_TEMP_SENSOR2_DIS_MASK, 0);
+}
+
 static const struct hwmon_channel_info * const mv88q2xxx_hwmon_info[] = {
        HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_ALARM),
        NULL
@@ -762,11 +724,13 @@ 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;
+       int ret;
 
-       priv->enable_temp = true;
+       ret = mv88q2xxx_enable_temp_sense(phydev);
+       if (ret < 0)
+               return ret;
 
        hwmon = devm_hwmon_device_register_with_info(dev, NULL, phydev,
                                                     &mv88q2xxx_hwmon_chip_info,
@@ -776,6 +740,11 @@ static int mv88q2xxx_hwmon_probe(struct phy_device *phydev)
 }
 
 #else
+static int mv88q2xxx_enable_temp_sense(struct phy_device *phydev)
+{
+       return 0;
+}
+
 static int mv88q2xxx_hwmon_probe(struct phy_device *phydev)
 {
        return 0;
@@ -843,6 +812,48 @@ static int mv88q2xxx_probe(struct phy_device *phydev)
        return mv88q2xxx_hwmon_probe(phydev);
 }
 
+static int mv88q2xxx_config_init(struct phy_device *phydev)
+{
+       struct mv88q2xxx_priv *priv = phydev->priv;
+       int ret;
+
+       /* The 88Q2XXX PHYs do have the extended ability register available, but
+        * register MDIO_PMA_EXTABLE where they should signalize it does not
+        * work according to specification. Therefore, we force it here.
+        */
+       phydev->pma_extable = MDIO_PMA_EXTABLE_BT1;
+
+       /* Configure interrupt with default settings, output is driven low for
+        * active interrupt and high for inactive.
+        */
+       if (phy_interrupt_is_valid(phydev)) {
+               ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS,
+                                      MDIO_MMD_PCS_MV_GPIO_INT_CTRL,
+                                      MDIO_MMD_PCS_MV_GPIO_INT_CTRL_TRI_DIS);
+               if (ret < 0)
+                       return ret;
+       }
+
+       /* Enable LED function and disable TX disable feature on LED/TX_ENABLE */
+       if (priv->enable_led0) {
+               ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PCS,
+                                        MDIO_MMD_PCS_MV_RESET_CTRL,
+                                        MDIO_MMD_PCS_MV_RESET_CTRL_TX_DISABLE);
+               if (ret < 0)
+                       return ret;
+       }
+
+       /* Enable temperature sense again. There might have been a hard reset
+        * of the PHY and in this case the register content is restored to
+        * defaults and we need to enable it again.
+        */
+       ret = mv88q2xxx_enable_temp_sense(phydev);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 static int mv88q2110_config_init(struct phy_device *phydev)
 {
        int ret;