From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vinod Koul Subject: [PATCH 6/7] net: phy: at803x: Add support to disable tx/rx delays Date: Wed, 2 Jan 2019 14:47:28 +0530 Message-ID: <20190102091729.18582-7-vkoul@kernel.org> References: <20190102091729.18582-1-vkoul@kernel.org> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Niklas Cassel , Bjorn Andersson , Vinod Koul , Andrew Lunn , Florian Fainelli To: "David S . Miller" Return-path: Received: from mail.kernel.org ([198.145.29.99]:46868 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726782AbfABJT7 (ORCPT ); Wed, 2 Jan 2019 04:19:59 -0500 In-Reply-To: <20190102091729.18582-1-vkoul@kernel.org> Sender: netdev-owner@vger.kernel.org List-ID: Some controllers require the tx and rx delays to be disabled. So check the property and if present do not enable the delay and disable the delay explicitly. Signed-off-by: Vinod Koul --- drivers/net/phy/at803x.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c index 63e3d3d774d1..9bfc0d381159 100644 --- a/drivers/net/phy/at803x.c +++ b/drivers/net/phy/at803x.c @@ -122,6 +122,17 @@ static inline int at803x_enable_tx_delay(struct phy_device *phydev) AT803X_DEBUG_TX_CLK_DLY_EN); } +static inline int at803x_disable_rx_delay(struct phy_device *phydev) +{ + return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, + AT803X_DEBUG_RX_CLK_DLY_EN, 0); +} + +static inline int at803x_disable_tx_delay(struct phy_device *phydev) +{ + return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, + AT803X_DEBUG_TX_CLK_DLY_EN, 0); +} /* save relevant PHY registers to private copy */ static void at803x_context_save(struct phy_device *phydev, struct at803x_context *context) @@ -250,12 +261,18 @@ static int at803x_probe(struct phy_device *phydev) static int at803x_config_init(struct phy_device *phydev) { bool rx_delay = false, tx_delay = false; + bool rx_disable_prop, tx_disable_prop; int ret; ret = genphy_config_init(phydev); if (ret < 0) return ret; + rx_disable_prop = device_property_read_bool(&phydev->mdio.dev, + "rx-delay-disable"); + tx_disable_prop = device_property_read_bool(&phydev->mdio.dev, + "rx-delay-disable"); + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) rx_delay = true; @@ -263,6 +280,12 @@ static int at803x_config_init(struct phy_device *phydev) phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) tx_delay = true; + /* if DT specified disable delay then don't enable it */ + if (rx_disable_prop) + rx_delay = false; + if (tx_disable_prop) + tx_delay = false; + if (rx_delay) { ret = at803x_enable_rx_delay(phydev); if (ret < 0) @@ -275,6 +298,19 @@ static int at803x_config_init(struct phy_device *phydev) return ret; } + /* if DT specified disable delay then disable it explicitly */ + if (rx_disable_prop) { + ret = at803x_disable_rx_delay(phydev); + if (ret < 0) + return ret; + } + + if (tx_disable_prop) { + ret = at803x_disable_tx_delay(phydev); + if (ret < 0) + return ret; + } + return 0; } -- 2.20.1