mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 14:13:16 +00:00
195 lines
6.2 KiB
Diff
195 lines
6.2 KiB
Diff
|
From 0a6fc70d76bddf98278af2ac000379c82aec8f11 Mon Sep 17 00:00:00 2001
|
|||
|
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
|
|||
|
Date: Mon, 29 Aug 2022 10:30:46 +0200
|
|||
|
Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Remove broken reset
|
|||
|
support
|
|||
|
MIME-Version: 1.0
|
|||
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|||
|
Reset support for SATA PHY is somehow broken and after calling it, kernel
|
|||
|
is not able to detect and initialize SATA disk Samsung SSD 850 EMT0 [1].
|
|||
|
|
|||
|
Reset support was introduced in commit 934337080c6c ("phy: marvell:
|
|||
|
phy-mvebu-a3700-comphy: Add native kernel implementation") as part of
|
|||
|
complete rewrite of this driver. v1 patch series of that commit [2] did
|
|||
|
not contain reset support and was tested that is working fine with
|
|||
|
Ethernet, SATA and USB PHYs without issues too.
|
|||
|
|
|||
|
So for now remove broken reset support and change implementation of
|
|||
|
power_off callback to power off all functions on specified lane (and not
|
|||
|
only selected function) because during startup kernel does not know which
|
|||
|
function was selected and configured by bootloader. Same logic was used
|
|||
|
also in v1 patch series of that commit.
|
|||
|
|
|||
|
This change fixes issues with initialization of SATA disk Samsung SSD 850
|
|||
|
and disk is working again, like before mentioned commit.
|
|||
|
|
|||
|
Once problem with PHY reset callback is solved its functionality could be
|
|||
|
re-introduced. But for now it is unknown why it does not work.
|
|||
|
|
|||
|
[1] - https://lore.kernel.org/r/20220531124159.3e4lgn2v462irbtz@shindev/
|
|||
|
[2] - https://lore.kernel.org/r/20211028184242.22105-1-kabel@kernel.org/
|
|||
|
|
|||
|
Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
|
|||
|
Fixes: 934337080c6c ("phy: marvell: phy-mvebu-a3700-comphy: Add native kernel implementation")
|
|||
|
Cc: stable@vger.kernel.org # v5.18+
|
|||
|
Signed-off-by: Pali Rohár <pali@kernel.org>
|
|||
|
Tested-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
|
|||
|
Link: https://lore.kernel.org/r/20220829083046.15082-1-pali@kernel.org
|
|||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
|||
|
---
|
|||
|
drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 87 ++++----------------
|
|||
|
1 file changed, 17 insertions(+), 70 deletions(-)
|
|||
|
|
|||
|
--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
|
|||
|
+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
|
|||
|
@@ -274,7 +274,6 @@ struct mvebu_a3700_comphy_lane {
|
|||
|
int submode;
|
|||
|
bool invert_tx;
|
|||
|
bool invert_rx;
|
|||
|
- bool needs_reset;
|
|||
|
};
|
|||
|
|
|||
|
struct gbe_phy_init_data_fix {
|
|||
|
@@ -1097,40 +1096,12 @@ mvebu_a3700_comphy_pcie_power_off(struct
|
|||
|
0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT);
|
|||
|
}
|
|||
|
|
|||
|
-static int mvebu_a3700_comphy_reset(struct phy *phy)
|
|||
|
+static void mvebu_a3700_comphy_usb3_power_off(struct mvebu_a3700_comphy_lane *lane)
|
|||
|
{
|
|||
|
- struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy);
|
|||
|
- u16 mask, data;
|
|||
|
-
|
|||
|
- dev_dbg(lane->dev, "resetting lane %d\n", lane->id);
|
|||
|
-
|
|||
|
- /* COMPHY reset for internal logic */
|
|||
|
- comphy_lane_reg_set(lane, COMPHY_SFT_RESET,
|
|||
|
- SFT_RST_NO_REG, SFT_RST_NO_REG);
|
|||
|
-
|
|||
|
- /* COMPHY register reset (cleared automatically) */
|
|||
|
- comphy_lane_reg_set(lane, COMPHY_SFT_RESET, SFT_RST, SFT_RST);
|
|||
|
-
|
|||
|
- /* PIPE soft and register reset */
|
|||
|
- data = PIPE_SOFT_RESET | PIPE_REG_RESET;
|
|||
|
- mask = data;
|
|||
|
- comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask);
|
|||
|
-
|
|||
|
- /* Release PIPE register reset */
|
|||
|
- comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL,
|
|||
|
- 0x0, PIPE_REG_RESET);
|
|||
|
-
|
|||
|
- /* Reset SB configuration register (only for lanes 0 and 1) */
|
|||
|
- if (lane->id == 0 || lane->id == 1) {
|
|||
|
- u32 mask, data;
|
|||
|
-
|
|||
|
- data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT |
|
|||
|
- PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT;
|
|||
|
- mask = data | PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT;
|
|||
|
- comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask);
|
|||
|
- }
|
|||
|
-
|
|||
|
- return 0;
|
|||
|
+ /*
|
|||
|
+ * The USB3 MAC sets the USB3 PHY to low state, so we do not
|
|||
|
+ * need to power off USB3 PHY again.
|
|||
|
+ */
|
|||
|
}
|
|||
|
|
|||
|
static bool mvebu_a3700_comphy_check_mode(int lane,
|
|||
|
@@ -1171,10 +1142,6 @@ static int mvebu_a3700_comphy_set_mode(s
|
|||
|
(lane->mode != mode || lane->submode != submode))
|
|||
|
return -EBUSY;
|
|||
|
|
|||
|
- /* If changing mode, ensure reset is called */
|
|||
|
- if (lane->mode != PHY_MODE_INVALID && lane->mode != mode)
|
|||
|
- lane->needs_reset = true;
|
|||
|
-
|
|||
|
/* Just remember the mode, ->power_on() will do the real setup */
|
|||
|
lane->mode = mode;
|
|||
|
lane->submode = submode;
|
|||
|
@@ -1185,7 +1152,6 @@ static int mvebu_a3700_comphy_set_mode(s
|
|||
|
static int mvebu_a3700_comphy_power_on(struct phy *phy)
|
|||
|
{
|
|||
|
struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy);
|
|||
|
- int ret;
|
|||
|
|
|||
|
if (!mvebu_a3700_comphy_check_mode(lane->id, lane->mode,
|
|||
|
lane->submode)) {
|
|||
|
@@ -1193,14 +1159,6 @@ static int mvebu_a3700_comphy_power_on(s
|
|||
|
return -EINVAL;
|
|||
|
}
|
|||
|
|
|||
|
- if (lane->needs_reset) {
|
|||
|
- ret = mvebu_a3700_comphy_reset(phy);
|
|||
|
- if (ret)
|
|||
|
- return ret;
|
|||
|
-
|
|||
|
- lane->needs_reset = false;
|
|||
|
- }
|
|||
|
-
|
|||
|
switch (lane->mode) {
|
|||
|
case PHY_MODE_USB_HOST_SS:
|
|||
|
dev_dbg(lane->dev, "set lane %d to USB3 host mode\n", lane->id);
|
|||
|
@@ -1224,38 +1182,28 @@ static int mvebu_a3700_comphy_power_off(
|
|||
|
{
|
|||
|
struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy);
|
|||
|
|
|||
|
- switch (lane->mode) {
|
|||
|
- case PHY_MODE_USB_HOST_SS:
|
|||
|
- /*
|
|||
|
- * The USB3 MAC sets the USB3 PHY to low state, so we do not
|
|||
|
- * need to power off USB3 PHY again.
|
|||
|
- */
|
|||
|
- break;
|
|||
|
-
|
|||
|
- case PHY_MODE_SATA:
|
|||
|
- mvebu_a3700_comphy_sata_power_off(lane);
|
|||
|
- break;
|
|||
|
-
|
|||
|
- case PHY_MODE_ETHERNET:
|
|||
|
+ switch (lane->id) {
|
|||
|
+ case 0:
|
|||
|
+ mvebu_a3700_comphy_usb3_power_off(lane);
|
|||
|
mvebu_a3700_comphy_ethernet_power_off(lane);
|
|||
|
- break;
|
|||
|
-
|
|||
|
- case PHY_MODE_PCIE:
|
|||
|
+ return 0;
|
|||
|
+ case 1:
|
|||
|
mvebu_a3700_comphy_pcie_power_off(lane);
|
|||
|
- break;
|
|||
|
-
|
|||
|
+ mvebu_a3700_comphy_ethernet_power_off(lane);
|
|||
|
+ return 0;
|
|||
|
+ case 2:
|
|||
|
+ mvebu_a3700_comphy_usb3_power_off(lane);
|
|||
|
+ mvebu_a3700_comphy_sata_power_off(lane);
|
|||
|
+ return 0;
|
|||
|
default:
|
|||
|
dev_err(lane->dev, "invalid COMPHY mode\n");
|
|||
|
return -EINVAL;
|
|||
|
}
|
|||
|
-
|
|||
|
- return 0;
|
|||
|
}
|
|||
|
|
|||
|
static const struct phy_ops mvebu_a3700_comphy_ops = {
|
|||
|
.power_on = mvebu_a3700_comphy_power_on,
|
|||
|
.power_off = mvebu_a3700_comphy_power_off,
|
|||
|
- .reset = mvebu_a3700_comphy_reset,
|
|||
|
.set_mode = mvebu_a3700_comphy_set_mode,
|
|||
|
.owner = THIS_MODULE,
|
|||
|
};
|
|||
|
@@ -1393,8 +1341,7 @@ static int mvebu_a3700_comphy_probe(stru
|
|||
|
* To avoid relying on the bootloader/firmware configuration,
|
|||
|
* power off all comphys.
|
|||
|
*/
|
|||
|
- mvebu_a3700_comphy_reset(phy);
|
|||
|
- lane->needs_reset = false;
|
|||
|
+ mvebu_a3700_comphy_power_off(phy);
|
|||
|
}
|
|||
|
|
|||
|
provider = devm_of_phy_provider_register(&pdev->dev,
|