]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phy: tegra: xusb: Decouple CYA_TRK_CODE_UPDATE_ON_IDLE from trk_hw_mode
authorWayne Chang <waynec@nvidia.com>
Mon, 19 May 2025 09:09:28 +0000 (17:09 +0800)
committerVinod Koul <vkoul@kernel.org>
Sun, 15 Jun 2025 14:16:01 +0000 (19:46 +0530)
The logic that drives the pad calibration values resides in the
controller reset domain and so the calibration values are only being
captured when the controller is out of reset. However, by clearing the
CYA_TRK_CODE_UPDATE_ON_IDLE bit, the calibration values can be set
while the controller is in reset.

The CYA_TRK_CODE_UPDATE_ON_IDLE bit was previously cleared based on the
trk_hw_mode flag, but this dependency is not necessary. Instead,
introduce a new flag, trk_update_on_idle, to independently control this
bit.

Fixes: d8163a32ca95 ("phy: tegra: xusb: Add Tegra234 support")
Cc: stable@vger.kernel.org
Signed-off-by: Wayne Chang <waynec@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Link: https://lore.kernel.org/r/20250519090929.3132456-2-waynec@nvidia.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/tegra/xusb-tegra186.c
drivers/phy/tegra/xusb.h

index 23a23f2d64e5866fdbd81cabed9ea27e78ea1d6f..683692f0ec3c0b999dfd3334a52fbb580bb18b48 100644 (file)
@@ -648,14 +648,15 @@ static void tegra186_utmi_bias_pad_power_on(struct tegra_xusb_padctl *padctl)
                udelay(100);
        }
 
-       if (padctl->soc->trk_hw_mode) {
-               value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL2);
-               value |= USB2_TRK_HW_MODE;
+       value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL2);
+       if (padctl->soc->trk_update_on_idle)
                value &= ~CYA_TRK_CODE_UPDATE_ON_IDLE;
-               padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL2);
-       } else {
+       if (padctl->soc->trk_hw_mode)
+               value |= USB2_TRK_HW_MODE;
+       padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL2);
+
+       if (!padctl->soc->trk_hw_mode)
                clk_disable_unprepare(priv->usb2_trk_clk);
-       }
 }
 
 static void tegra186_utmi_bias_pad_power_off(struct tegra_xusb_padctl *padctl)
@@ -1711,6 +1712,7 @@ const struct tegra_xusb_padctl_soc tegra234_xusb_padctl_soc = {
        .supports_gen2 = true,
        .poll_trk_completed = true,
        .trk_hw_mode = true,
+       .trk_update_on_idle = true,
        .supports_lp_cfg_en = true,
 };
 EXPORT_SYMBOL_GPL(tegra234_xusb_padctl_soc);
index 6e45d194c68947618778dc132720ae757f5fd656..d2b5f95651324a85ec6cfea8075e591732edc530 100644 (file)
@@ -434,6 +434,7 @@ struct tegra_xusb_padctl_soc {
        bool need_fake_usb3_port;
        bool poll_trk_completed;
        bool trk_hw_mode;
+       bool trk_update_on_idle;
        bool supports_lp_cfg_en;
 };