phy: uniphier-pcie: Fix updating phy parameters
authorKunihiko Hayashi <hayashi.kunihiko@socionext.com>
Mon, 7 Jun 2021 03:50:42 +0000 (12:50 +0900)
committerVinod Koul <vkoul@kernel.org>
Mon, 21 Jun 2021 06:33:05 +0000 (12:03 +0530)
The current driver uses a value from register TEST_O as the original
value for register TEST_I, though, the value is overwritten by "param",
so there is a bug that the original value isn't no longer used.

The value of TEST_O[7:0] should be masked with "mask", replaced with
"param", and placed in the bitfield TESTI_DAT_MASK as new TEST_I value.

Fixes: c6d9b1324159 ("phy: socionext: add PCIe PHY driver support")
Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Link: https://lore.kernel.org/r/1623037842-19363-1-git-send-email-hayashi.kunihiko@socionext.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/socionext/phy-uniphier-pcie.c

index e4adab375c73706cdc510327939a25e381209822..6bdbd1f214dd46960ba65c80703d05c01b74dfb6 100644 (file)
 #define PORT_SEL_1             FIELD_PREP(PORT_SEL_MASK, 1)
 
 #define PCL_PHY_TEST_I         0x2000
-#define PCL_PHY_TEST_O         0x2004
 #define TESTI_DAT_MASK         GENMASK(13, 6)
 #define TESTI_ADR_MASK         GENMASK(5, 1)
 #define TESTI_WR_EN            BIT(0)
 
+#define PCL_PHY_TEST_O         0x2004
+#define TESTO_DAT_MASK         GENMASK(7, 0)
+
 #define PCL_PHY_RESET          0x200c
 #define PCL_PHY_RESET_N_MNMODE BIT(8)  /* =1:manual */
 #define PCL_PHY_RESET_N                BIT(0)  /* =1:deasssert */
@@ -77,11 +79,12 @@ static void uniphier_pciephy_set_param(struct uniphier_pciephy_priv *priv,
        val  = FIELD_PREP(TESTI_DAT_MASK, 1);
        val |= FIELD_PREP(TESTI_ADR_MASK, reg);
        uniphier_pciephy_testio_write(priv, val);
-       val = readl(priv->base + PCL_PHY_TEST_O);
+       val = readl(priv->base + PCL_PHY_TEST_O) & TESTO_DAT_MASK;
 
        /* update value */
-       val &= ~FIELD_PREP(TESTI_DAT_MASK, mask);
-       val  = FIELD_PREP(TESTI_DAT_MASK, mask & param);
+       val &= ~mask;
+       val |= mask & param;
+       val = FIELD_PREP(TESTI_DAT_MASK, val);
        val |= FIELD_PREP(TESTI_ADR_MASK, reg);
        uniphier_pciephy_testio_write(priv, val);
        uniphier_pciephy_testio_write(priv, val | TESTI_WR_EN);