diff mbox series

[net-next,1/2] net: phy: dp83867: introduce critical chip default init for non-of platform

Message ID 20211013034128.2094426-2-boon.leong.ong@intel.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: phy: dp83867 non-OF and loopback support | expand

Checks

Context Check Description
netdev/cover_letter success Series has a cover letter
netdev/fixes_present success Fixes tag not required for -next series
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net-next
netdev/subject_prefix success Link
netdev/cc_maintainers success CCed 6 of 6 maintainers
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success No Fixes tag
netdev/checkpatch warning WARNING: Co-developed-by: must be immediately followed by Signed-off-by: WARNING: line length of 82 exceeds 80 columns
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success No static functions without inline keyword in header files

Commit Message

Ong Boon Leong Oct. 13, 2021, 3:41 a.m. UTC
From: "Lay, Kuan Loon" <kuan.loon.lay@intel.com>

PHY driver dp83867 has rich supports for OF-platform to fine-tune the PHY
chip during phy configuration. However, for non-OF platform, certain PHY
tunable parameters such as IO impedence and RX & TX internal delays are
critical and should be initialized to its default during PHY driver probe.

Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Co-developed-by: Ong Boon Leong <boon.leong.ong@intel.com>
Tested-by: Clement <clement@intel.com>
Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com>
---
 drivers/net/phy/dp83867.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

Comments

Andrew Lunn Oct. 19, 2021, 6:51 p.m. UTC | #1
On Wed, Oct 13, 2021 at 11:41:27AM +0800, Ong Boon Leong wrote:
> From: "Lay, Kuan Loon" <kuan.loon.lay@intel.com>
> 
> PHY driver dp83867 has rich supports for OF-platform to fine-tune the PHY
> chip during phy configuration. However, for non-OF platform, certain PHY
> tunable parameters such as IO impedence and RX & TX internal delays are
> critical and should be initialized to its default during PHY driver probe.
> 
> Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
> Co-developed-by: Ong Boon Leong <boon.leong.ong@intel.com>
> Tested-by: Clement <clement@intel.com>
> Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com>
> ---
>  drivers/net/phy/dp83867.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
> index 6bbc81ad295f..bb4369b75179 100644
> --- a/drivers/net/phy/dp83867.c
> +++ b/drivers/net/phy/dp83867.c
> @@ -619,6 +619,24 @@ static int dp83867_of_init(struct phy_device *phydev)
>  #else
>  static int dp83867_of_init(struct phy_device *phydev)
>  {
> +	struct dp83867_private *dp83867 = phydev->priv;
> +	u16 delay;

So this is in the stub for when OF is disabled. What about the case
that OF is enabled? I've used DT on x86, even Intel used it for
intel,ce4100 aka falconfalls. So rather than do this in the stub, i
would look at the value of dev->of_node. If it is NULL, do this. That
should always work, and it is how other drivers deal with none OF
cases.

> +	/* Per datasheet, IO impedance is default to 50-ohm, so we set the same
> +	 * here or else the default '0' means highest IO impedence which is wrong.
> +	 */
> +	dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
> +

I would prefer you add a new define
DP83867_IO_MUX_CFG_IO_IMPEDANCE_DEFAULT, which then avoids this very
odd looking 1/2 the minimum.

    Andrew
diff mbox series

Patch

diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
index 6bbc81ad295f..bb4369b75179 100644
--- a/drivers/net/phy/dp83867.c
+++ b/drivers/net/phy/dp83867.c
@@ -619,6 +619,24 @@  static int dp83867_of_init(struct phy_device *phydev)
 #else
 static int dp83867_of_init(struct phy_device *phydev)
 {
+	struct dp83867_private *dp83867 = phydev->priv;
+	u16 delay;
+
+	/* For non-OF device, the RX and TX ID values are either strapped
+	 * or take from default value. So, we init RX & TX ID values here
+	 * so that the RGMIIDCTL is configured correctly later in
+	 * dp83867_config_init();
+	 */
+	delay = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIIDCTL);
+	dp83867->rx_id_delay = delay & DP83867_RGMII_RX_CLK_DELAY_MAX;
+	dp83867->tx_id_delay = (delay >> DP83867_RGMII_TX_CLK_DELAY_SHIFT) &
+			       DP83867_RGMII_TX_CLK_DELAY_MAX;
+
+	/* Per datasheet, IO impedance is default to 50-ohm, so we set the same
+	 * here or else the default '0' means highest IO impedence which is wrong.
+	 */
+	dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
+
 	return 0;
 }
 #endif /* CONFIG_OF_MDIO */