From patchwork Wed Jan 23 16:05:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlo Caione X-Patchwork-Id: 1030034 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="GmOcaL7R"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43l9Cm34ysz9s3l for ; Thu, 24 Jan 2019 03:07:16 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 17393C21DEC; Wed, 23 Jan 2019 16:06:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 23DF4C21DDC; Wed, 23 Jan 2019 16:06:44 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A8725C21C38; Wed, 23 Jan 2019 16:06:40 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id 4C022C21C27 for ; Wed, 23 Jan 2019 16:06:40 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id z5so3093471wrt.11 for ; Wed, 23 Jan 2019 08:06:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=etCdB7yIZnyWYDXL/HE5iG8Caim8JtP/RCryk9ZIJm8=; b=GmOcaL7RIupWlc2IQ7EIRbVboazCRUki15gzhCJ5AkXuE2spS03RGbYk3rm2Trb6IR UuWyJSc3QUkWxVLHad2x7xxODlJTY/vTaufzcC0VQy6gJ//zwT17BdSMDSjAQCPt3S4T WSMlxcL6vNZHqQLVB7MX4fUh3NztivN64U4hPywOciSqN80QhMOOacL3HPoHWn7HowQH 9dTyYetizyDjVdsqzycZTTGUURfRTPcLZvrwCOP5yNIdi2Wf4Oh598euO/tBGPhc+eBA cQjuwEQbSKGZUaeEdbWxRjr5USuC3VjQyAiOwdhuLCpDdyj1dPVxGI7yyx07XifrCHKx +2Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=etCdB7yIZnyWYDXL/HE5iG8Caim8JtP/RCryk9ZIJm8=; b=qe+0VezyHcJluo3pslATimRT8Hd88BnuAxdhdCWwbI52gl7aJi3zWSYF9PxgFZsvT7 YOxwoaRgtBtD+xPhM5vNDsE95dTVCF8+4dcVbIb76Ibzsdd1DM2ewse1GzRRacUkUtJx mzTP7Zr/UZzN+/Huf4Rp7jLaapeyg0sgd01X97KUyyKPJjwzh2RUm0UMBQaaU8UxEOga WZ/vhdxL4fc7OgpAJeTXhP/aiYV35HSplBXpK+RCHk85TcGCabg2t1UwxytWKjS8hlR3 +bYpnFgGXJrGaerrJ8FgC0B738bmUMvoebm1b4JfuW9OsTVYwbfJaXIG39jnk12W7S8r 9B7A== X-Gm-Message-State: AJcUukdveiymgdIV1H5l6ipOlprjiKLFRT+6yrA/xt78Eii5xvJX83Lf hBU9W9ldG50nOc3y5Qk3CHU7vA== X-Google-Smtp-Source: ALg8bN4p1vYtCKxCfjwI3YeqTVjTJuaWeuPbTkIkevKT2lK0fgsuTVKd2j3Zdm4NGxDF2HiZg86fpg== X-Received: by 2002:adf:e5d0:: with SMTP id a16mr3399277wrn.89.1548259599891; Wed, 23 Jan 2019 08:06:39 -0800 (PST) Received: from localhost.localdomain ([2a00:23c4:f7a1:ce00:5105:4b7b:c922:7c6]) by smtp.gmail.com with ESMTPSA id s16sm88252414wrt.77.2019.01.23.08.06.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jan 2019 08:06:38 -0800 (PST) From: Carlo Caione To: joe.hershberger@ni.com, joseph.hershberger@ni.com, vladimir.oltean@nxp.com, u-boot@lists.denx.de Date: Wed, 23 Jan 2019 16:05:50 +0000 Message-Id: <20190123160552.766-2-ccaione@baylibre.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190123160552.766-1-ccaione@baylibre.com> References: <20190123160552.766-1-ccaione@baylibre.com> MIME-Version: 1.0 Cc: Carlo Caione Subject: [U-Boot] [PATCH v3 1/3] net: phy: Add support for accessing MMD PHY registers X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Two new helper functions (phy_read_mmd() and phy_write_mmd()) are added to allow access to the MMD PHY registers. The MMD PHY registers can be accessed by two means: 1. Using two new MMD access function hooks in the PHY driver. These functions can be implemented when the PHY driver does not support the standard IEEE Compatible clause 45 access mechanism described in clause 22 or if the PHY uses its own non-standard access mechanism. 2. The standard clause 45 access extensions to the MMD registers through the indirection registers (clause 22) in all the other cases. Signed-off-by: Carlo Caione Acked-by: Joe Hershberger --- drivers/net/phy/phy.c | 4 ++++ include/phy.h | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index cda4caa803..6769047407 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -549,6 +549,10 @@ int phy_register(struct phy_driver *drv) drv->readext += gd->reloc_off; if (drv->writeext) drv->writeext += gd->reloc_off; + if (drv->read_mmd) + drv->read_mmd += gd->reloc_off; + if (drv->write_mmd) + drv->write_mmd += gd->reloc_off; #endif return 0; } diff --git a/include/phy.h b/include/phy.h index b86fdfb2ce..f6f6f097af 100644 --- a/include/phy.h +++ b/include/phy.h @@ -101,6 +101,13 @@ struct phy_driver { int (*readext)(struct phy_device *phydev, int addr, int devad, int reg); int (*writeext)(struct phy_device *phydev, int addr, int devad, int reg, u16 val); + + /* Phy specific driver override for reading a MMD register */ + int (*read_mmd)(struct phy_device *phydev, int devad, int reg); + + /* Phy specific driver override for writing a MMD register */ + int (*write_mmd)(struct phy_device *phydev, int devad, int reg, u16 val); + struct list_head list; }; @@ -164,6 +171,51 @@ static inline int phy_write(struct phy_device *phydev, int devad, int regnum, return bus->write(bus, phydev->addr, devad, regnum, val); } +static inline void phy_mmd_start_indirect(struct phy_device *phydev, int devad, + int regnum) +{ + /* Write the desired MMD Devad */ + phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL, devad); + + /* Write the desired MMD register address */ + phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, regnum); + + /* Select the Function : DATA with no post increment */ + phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); +} + +static inline int phy_read_mmd(struct phy_device *phydev, int devad, + int regnum) +{ + if (regnum > (u16)~0 || devad > 32) + return -EINVAL; + + if (phydev->drv->read_mmd) { + return phydev->drv->read_mmd(phydev, devad, regnum); + } else { + phy_mmd_start_indirect(phydev, devad, regnum); + + /* Read the content of the MMD's selected register */ + return phy_read(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA); + } +} + +static inline int phy_write_mmd(struct phy_device *phydev, int devad, + int regnum, u16 val) +{ + if (regnum > (u16)~0 || devad > 32) + return -EINVAL; + + if (phydev->drv->write_mmd) { + return phydev->drv->write_mmd(phydev, devad, regnum, val); + } else { + phy_mmd_start_indirect(phydev, devad, regnum); + + /* Write the data into MMD's selected register */ + return phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, val); + } +} + #ifdef CONFIG_PHYLIB_10G extern struct phy_driver gen10g_driver; From patchwork Wed Jan 23 16:05:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlo Caione X-Patchwork-Id: 1030038 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="itylCWoO"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43l9Dv1WT3z9s3q for ; Thu, 24 Jan 2019 03:08:15 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id BF6C1C21E12; Wed, 23 Jan 2019 16:07:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A72ACC21D74; Wed, 23 Jan 2019 16:06:48 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E5A04C21D72; Wed, 23 Jan 2019 16:06:44 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by lists.denx.de (Postfix) with ESMTPS id 9C999C21C3F for ; Wed, 23 Jan 2019 16:06:41 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id s12so3116216wrt.4 for ; Wed, 23 Jan 2019 08:06:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=o12o4u6JWi9+7ZVAxUY8HVGhzf62KE7bXOW3mRybFy4=; b=itylCWoOrwC+7VxFYFrnSojuenxcLMU0pWRWpLIFl124XYsNcIGRB5ktpQznLh+rHy Q+59Nt4m1e69nxzCWoLiv9kRBvUBKyqhj6QlfC0Y2efaVmlLgK8+41EBDpRxsI9/6pOa 7fNWXwjpjc4hTz+kPuEhAiHMGiAGO/+f7VnE3kldrI0BVvq8wAzbD/XW8l/qcRW4VJAy sLwZ5uY9ofpcl/hlK2J5RXjmVSxlNbAJKxUgAVq4MeMEzPMD8vTwNVhV3zdxNcUSz1pY QPK9zhaWsFiJIugKtvIz3+Y7rS1/J25YZ7kskmFbbDHxz4o7gvZurE7Ep+8XZxpxFl6W fCXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=o12o4u6JWi9+7ZVAxUY8HVGhzf62KE7bXOW3mRybFy4=; b=aPRub0yr+zrKRH+TcHT74BPI51FIFpldFT5dF0gyCDZlwIKa7QEcprSkCeK/sU5nEi D9pqkwureqKs99WqtuEibUu3AMAxjU4prp6SChgTih13bOWkZhkCDhJleQiNau+8/mZC JGMGeWlQwZKk3aEDioV+11pKpcwcRsN3//HHtZocONpsaFMoQMCk7EKeghtFsuKgKqft D3XXJ7IEoyjF0pQ/FrVvsxILdyRuSnuZ4p3vjgr8tbuSlL/omxWtr31X4o9kLGUOpSnK PX6cbJeNpx3LUWvnfXb1XJflpkXuNF1yMtsqr1r8pqI22zKC1V/W6F/+ezDVWZCTgecy sYfw== X-Gm-Message-State: AJcUukdsPzRYsKU1ktuwhLbfC7GnCVF1eBbNEkzTrDJcC2HxuyHd0t/o X7O46TWewet3ciqb923pSUtM2g== X-Google-Smtp-Source: ALg8bN59VhN7Y6AE3lxhYMzaTSUADu11bE01BUOZx8EfopdpbX2QgHGmzcRcJnSzVTcZjc2vVnO09A== X-Received: by 2002:a5d:4b01:: with SMTP id v1mr3321489wrq.5.1548259601066; Wed, 23 Jan 2019 08:06:41 -0800 (PST) Received: from localhost.localdomain ([2a00:23c4:f7a1:ce00:5105:4b7b:c922:7c6]) by smtp.gmail.com with ESMTPSA id s16sm88252414wrt.77.2019.01.23.08.06.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jan 2019 08:06:40 -0800 (PST) From: Carlo Caione To: joe.hershberger@ni.com, joseph.hershberger@ni.com, vladimir.oltean@nxp.com, u-boot@lists.denx.de Date: Wed, 23 Jan 2019 16:05:51 +0000 Message-Id: <20190123160552.766-3-ccaione@baylibre.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190123160552.766-1-ccaione@baylibre.com> References: <20190123160552.766-1-ccaione@baylibre.com> MIME-Version: 1.0 Cc: Carlo Caione Subject: [U-Boot] [PATCH v3 2/3] net: phy: ti: use generic helpers to access MMD registers X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Now that generic helpers are available, use those instead of relying on ti specific functions. Signed-off-by: Carlo Caione Signed-off-by: Vladimir Oltean Acked-by: Joe Hershberger --- drivers/net/phy/ti.c | 130 +++++++++---------------------------------- 1 file changed, 25 insertions(+), 105 deletions(-) diff --git a/drivers/net/phy/ti.c b/drivers/net/phy/ti.c index 6db6edd0d0..6ac890a7f5 100644 --- a/drivers/net/phy/ti.c +++ b/drivers/net/phy/ti.c @@ -73,16 +73,6 @@ #define MII_DP83867_CFG2_SPEEDOPT_INTLOW 0x2000 #define MII_DP83867_CFG2_MASK 0x003F -#define MII_MMD_CTRL 0x0d /* MMD Access Control Register */ -#define MII_MMD_DATA 0x0e /* MMD Access Data Register */ - -/* MMD Access Control register fields */ -#define MII_MMD_CTRL_DEVAD_MASK 0x1f /* Mask MMD DEVAD*/ -#define MII_MMD_CTRL_ADDR 0x0000 /* Address */ -#define MII_MMD_CTRL_NOINCR 0x4000 /* no post increment */ -#define MII_MMD_CTRL_INCR_RDWT 0x8000 /* post increment on reads & writes */ -#define MII_MMD_CTRL_INCR_ON_WT 0xC000 /* post increment on writes only */ - /* User setting - can be taken from DTS */ #define DEFAULT_RX_ID_DELAY DP83867_RGMIIDCTL_2_25_NS #define DEFAULT_TX_ID_DELAY DP83867_RGMIIDCTL_2_75_NS @@ -116,88 +106,20 @@ struct dp83867_private { int clk_output_sel; }; -/** - * phy_read_mmd_indirect - reads data from the MMD registers - * @phydev: The PHY device bus - * @prtad: MMD Address - * @devad: MMD DEVAD - * @addr: PHY address on the MII bus - * - * Description: it reads data from the MMD registers (clause 22 to access to - * clause 45) of the specified phy address. - * To read these registers we have: - * 1) Write reg 13 // DEVAD - * 2) Write reg 14 // MMD Address - * 3) Write reg 13 // MMD Data Command for MMD DEVAD - * 3) Read reg 14 // Read MMD data - */ -int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, - int devad, int addr) -{ - int value = -1; - - /* Write the desired MMD Devad */ - phy_write(phydev, addr, MII_MMD_CTRL, devad); - - /* Write the desired MMD register address */ - phy_write(phydev, addr, MII_MMD_DATA, prtad); - - /* Select the Function : DATA with no post increment */ - phy_write(phydev, addr, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); - - /* Read the content of the MMD's selected register */ - value = phy_read(phydev, addr, MII_MMD_DATA); - return value; -} - -/** - * phy_write_mmd_indirect - writes data to the MMD registers - * @phydev: The PHY device - * @prtad: MMD Address - * @devad: MMD DEVAD - * @addr: PHY address on the MII bus - * @data: data to write in the MMD register - * - * Description: Write data from the MMD registers of the specified - * phy address. - * To write these registers we have: - * 1) Write reg 13 // DEVAD - * 2) Write reg 14 // MMD Address - * 3) Write reg 13 // MMD Data Command for MMD DEVAD - * 3) Write reg 14 // Write MMD data - */ -void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, - int devad, int addr, u32 data) -{ - /* Write the desired MMD Devad */ - phy_write(phydev, addr, MII_MMD_CTRL, devad); - - /* Write the desired MMD register address */ - phy_write(phydev, addr, MII_MMD_DATA, prtad); - - /* Select the Function : DATA with no post increment */ - phy_write(phydev, addr, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); - - /* Write the data into MMD's selected register */ - phy_write(phydev, addr, MII_MMD_DATA, data); -} - static int dp83867_config_port_mirroring(struct phy_device *phydev) { struct dp83867_private *dp83867 = (struct dp83867_private *)phydev->priv; u16 val; - val = phy_read_mmd_indirect(phydev, DP83867_CFG4, DP83867_DEVADDR, - phydev->addr); + val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4); if (dp83867->port_mirroring == DP83867_PORT_MIRRORING_EN) val |= DP83867_CFG4_PORT_MIRROR_EN; else val &= ~DP83867_CFG4_PORT_MIRROR_EN; - phy_write_mmd_indirect(phydev, DP83867_CFG4, DP83867_DEVADDR, - phydev->addr, val); + phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4, val); return 0; } @@ -257,13 +179,13 @@ static int dp83867_of_init(struct phy_device *phydev) /* Clock output selection if muxing property is set */ if (dp83867->clk_output_sel != DP83867_CLK_O_SEL_REF_CLK) { - val = phy_read_mmd_indirect(phydev, DP83867_IO_MUX_CFG, - DP83867_DEVADDR, phydev->addr); + val = phy_read_mmd(phydev, DP83867_DEVADDR, + DP83867_IO_MUX_CFG); val &= ~DP83867_IO_MUX_CFG_CLK_O_SEL_MASK; val |= (dp83867->clk_output_sel << DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT); - phy_write_mmd_indirect(phydev, DP83867_IO_MUX_CFG, - DP83867_DEVADDR, phydev->addr, val); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_IO_MUX_CFG, val); } return 0; @@ -308,11 +230,11 @@ static int dp83867_config(struct phy_device *phydev) /* Mode 1 or 2 workaround */ if (dp83867->rxctrl_strap_quirk) { - val = phy_read_mmd_indirect(phydev, DP83867_CFG4, - DP83867_DEVADDR, phydev->addr); + val = phy_read_mmd(phydev, DP83867_DEVADDR, + DP83867_CFG4); val &= ~BIT(7); - phy_write_mmd_indirect(phydev, DP83867_CFG4, - DP83867_DEVADDR, phydev->addr, val); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_CFG4, val); } if (phy_interface_is_rgmii(phydev)) { @@ -332,8 +254,8 @@ static int dp83867_config(struct phy_device *phydev) * register's bit 11 (marked as RESERVED). */ - bs = phy_read_mmd_indirect(phydev, DP83867_STRAP_STS1, - DP83867_DEVADDR, phydev->addr); + bs = phy_read_mmd(phydev, DP83867_DEVADDR, + DP83867_STRAP_STS1); val = phy_read(phydev, MDIO_DEVAD_NONE, MII_DP83867_PHYCTRL); if (bs & DP83867_STRAP_STS1_RESERVED) { val &= ~DP83867_PHYCR_RESERVED_MASK; @@ -354,8 +276,8 @@ static int dp83867_config(struct phy_device *phydev) MII_DP83867_CFG2_SPEEDOPT_INTLOW); phy_write(phydev, MDIO_DEVAD_NONE, MII_DP83867_CFG2, cfg2); - phy_write_mmd_indirect(phydev, DP83867_RGMIICTL, - DP83867_DEVADDR, phydev->addr, 0x0); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_RGMIICTL, 0x0); phy_write(phydev, MDIO_DEVAD_NONE, MII_DP83867_PHYCTRL, DP83867_PHYCTRL_SGMIIEN | @@ -367,8 +289,8 @@ static int dp83867_config(struct phy_device *phydev) } if (phy_interface_is_rgmii(phydev)) { - val = phy_read_mmd_indirect(phydev, DP83867_RGMIICTL, - DP83867_DEVADDR, phydev->addr); + val = phy_read_mmd(phydev, DP83867_DEVADDR, + DP83867_RGMIICTL); if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) val |= (DP83867_RGMII_TX_CLK_DELAY_EN | @@ -380,26 +302,24 @@ static int dp83867_config(struct phy_device *phydev) if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) val |= DP83867_RGMII_RX_CLK_DELAY_EN; - phy_write_mmd_indirect(phydev, DP83867_RGMIICTL, - DP83867_DEVADDR, phydev->addr, val); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_RGMIICTL, val); delay = (dp83867->rx_id_delay | (dp83867->tx_id_delay << DP83867_RGMII_TX_CLK_DELAY_SHIFT)); - phy_write_mmd_indirect(phydev, DP83867_RGMIIDCTL, - DP83867_DEVADDR, phydev->addr, delay); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_RGMIIDCTL, delay); if (dp83867->io_impedance >= 0) { - val = phy_read_mmd_indirect(phydev, - DP83867_IO_MUX_CFG, - DP83867_DEVADDR, - phydev->addr); + val = phy_read_mmd(phydev, + DP83867_DEVADDR, + DP83867_IO_MUX_CFG); val &= ~DP83867_IO_MUX_CFG_IO_IMPEDANCE_CTRL; val |= dp83867->io_impedance & DP83867_IO_MUX_CFG_IO_IMPEDANCE_CTRL; - phy_write_mmd_indirect(phydev, DP83867_IO_MUX_CFG, - DP83867_DEVADDR, phydev->addr, - val); + phy_write_mmd(phydev, DP83867_DEVADDR, + DP83867_IO_MUX_CFG, val); } } From patchwork Wed Jan 23 16:05:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlo Caione X-Patchwork-Id: 1030037 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="iIQdDxQ3"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43l9Dv2Ny3z9s3l for ; Thu, 24 Jan 2019 03:08:15 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 13B48C21E3A; Wed, 23 Jan 2019 16:07:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 4FD1FC21E02; Wed, 23 Jan 2019 16:06:54 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id C67F9C21D83; Wed, 23 Jan 2019 16:06:46 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id A1DDFC21DA2 for ; Wed, 23 Jan 2019 16:06:42 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id q18so3095453wrx.9 for ; Wed, 23 Jan 2019 08:06:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QNfeVxFctv2OlQDwCCWXudgQNT1eriGZ2CBs0w2+kkI=; b=iIQdDxQ3kTlw0QJ4ly+OVXF/nOU09EfKCP9wr5qZX+QNxvH9VFBvK1g23nTfhOuVjG OhIE9yQ99a6ben4+cPq0g3T6kuJQKtGLwkZ4TohLn08P+tifVb0bW+asMb6W+8pMIeoS nhQtdgfwKd5iWGG8lY5ZYSkr/D1y+T1ITYFYRZPTYsaaB++JKheboZbUhTnz/bfb1q9w wIOHjtYkI73vQ8Phktcmj3c7mclUoTDgsYkEMyHe1aQxzEegYxX/IH6bI9DvS575LcAD qt1QOEkcwGqa9fwP1HnjpvlO8WdekI0zh7p6dZ/3zgiH9ugTNVRt7vEvA8VH7HfyCbAe PfoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QNfeVxFctv2OlQDwCCWXudgQNT1eriGZ2CBs0w2+kkI=; b=pqiKmz5qH4N8HNEp/ObffcJxhNJh4w2tZ8t0DJy11sGDR72/JfmAGe8iJpx+P6esj5 m+B1x23RNtmsInXGQHfpC+dVaXppAL7DdJBjaqb0QrXJZ4kaZ/QIzCmaO4GaS6t5+hvf PlEf4L97GXylEMtaFcLxYo7LemT9jYLcGJna8IP4ZdKkDpLzLDb45CKXHa8ynwLSTK8+ 7YsC0VeFjxGpaJS33Jk8sip2n65lcYMswMl2TNMuk/Dx//YyAlCLm7YDFzTSteIBvric gaoil4puQihxkrGLWZlVisNJ4Hbfmb+T67+XM73VlYACssXdrMFaRFOs4salsFmDLm4Z Cxng== X-Gm-Message-State: AJcUukcSH6zoVAErjvrBFw2bUrh79hQW4gb/LT9oDC18UnjlfC9EjW0I OpvXoHBw3i5UkNOIwYfUnB7K2g== X-Google-Smtp-Source: ALg8bN563V4GbeXiRueXpAylalPaavWEkUbK6iDxFI1K5crdjEd35lq5r0+nf+CpXDR0ga4POtKMrw== X-Received: by 2002:adf:ba05:: with SMTP id o5mr3300832wrg.325.1548259602245; Wed, 23 Jan 2019 08:06:42 -0800 (PST) Received: from localhost.localdomain ([2a00:23c4:f7a1:ce00:5105:4b7b:c922:7c6]) by smtp.gmail.com with ESMTPSA id s16sm88252414wrt.77.2019.01.23.08.06.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jan 2019 08:06:41 -0800 (PST) From: Carlo Caione To: joe.hershberger@ni.com, joseph.hershberger@ni.com, vladimir.oltean@nxp.com, u-boot@lists.denx.de Date: Wed, 23 Jan 2019 16:05:52 +0000 Message-Id: <20190123160552.766-4-ccaione@baylibre.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190123160552.766-1-ccaione@baylibre.com> References: <20190123160552.766-1-ccaione@baylibre.com> MIME-Version: 1.0 Cc: Carlo Caione Subject: [U-Boot] [PATCH v3 3/3] cmd: mdio: Add new parameter to access MMD PHY registers X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Two new parameters (rmmd and wmmd) are added to allow the `mdio` command to access the content of the MMD PHY registers. Signed-off-by: Carlo Caione Acked-by: Joe Hershberger --- cmd/mdio.c | 51 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/cmd/mdio.c b/cmd/mdio.c index 184868063a..f4ae4541e7 100644 --- a/cmd/mdio.c +++ b/cmd/mdio.c @@ -43,7 +43,7 @@ static int mdio_write_ranges(struct phy_device *phydev, struct mii_dev *bus, int addrlo, int addrhi, int devadlo, int devadhi, int reglo, int reghi, unsigned short data, - int extended) + int extended, int mmd) { int addr, devad, reg; int err = 0; @@ -51,12 +51,14 @@ static int mdio_write_ranges(struct phy_device *phydev, struct mii_dev *bus, for (addr = addrlo; addr <= addrhi; addr++) { for (devad = devadlo; devad <= devadhi; devad++) { for (reg = reglo; reg <= reghi; reg++) { - if (!extended) - err = bus->write(bus, addr, devad, - reg, data); - else + if (mmd) + err = phy_write_mmd(phydev, devad, reg, data); + else if (extended) err = phydev->drv->writeext(phydev, addr, devad, reg, data); + else + err = bus->write(bus, addr, devad, + reg, data); if (err) goto err_out; @@ -71,7 +73,7 @@ err_out: static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus, int addrlo, int addrhi, int devadlo, int devadhi, - int reglo, int reghi, int extended) + int reglo, int reghi, int extended, int mmd) { int addr, devad, reg; @@ -83,11 +85,13 @@ static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus, for (reg = reglo; reg <= reghi; reg++) { int val; - if (!extended) - val = bus->read(bus, addr, devad, reg); - else + if (mmd) + val = phy_read_mmd(phydev, devad, reg); + else if (extended) val = phydev->drv->readext(phydev, addr, devad, reg); + else + val = bus->read(bus, addr, devad, reg); if (val < 0) { printf("Error\n"); @@ -189,6 +193,7 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) struct mii_dev *bus; struct phy_device *phydev = NULL; int extended = 0; + int mmd = 0; if (argc < 2) return CMD_RET_USAGE; @@ -222,14 +227,26 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) bus = phydev->bus; extended = 1; } else { - return -1; + return CMD_RET_FAILURE; } if (!phydev->drv || (!phydev->drv->writeext && (op[0] == 'w')) || (!phydev->drv->readext && (op[0] == 'r'))) { puts("PHY does not have extended functions\n"); - return -1; + return CMD_RET_FAILURE; + } + } + if (op[1] == 'm') { + phydev = mdio_phydev_for_ethname(argv[2]); + + if (phydev) { + addrlo = phydev->addr; + addrhi = addrlo; + bus = phydev->bus; + mmd = 1; + } else { + return CMD_RET_FAILURE; } } } @@ -242,13 +259,13 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (pos > 1) if (extract_reg_range(argv[pos--], &devadlo, &devadhi, ®lo, ®hi)) - return -1; + return CMD_RET_FAILURE; default: if (pos > 1) if (extract_phy_range(&argv[2], pos - 1, &bus, &phydev, &addrlo, &addrhi)) - return -1; + return CMD_RET_FAILURE; break; } @@ -265,12 +282,12 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) switch (op[0]) { case 'w': mdio_write_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, - reglo, reghi, data, extended); + reglo, reghi, data, extended, mmd); break; case 'r': mdio_read_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, - reglo, reghi, extended); + reglo, reghi, extended, mmd); break; } @@ -303,6 +320,10 @@ U_BOOT_CMD( "read PHY's extended register at .\n" "mdio wx [.] - " "write PHY's extended register at .\n" + "mdio rmmd [.] - " + "read PHY's extended register at .\n" + "mdio wmmd [.] - " + "write PHY's extended register at .\n" " may be:\n" " \n" " \n"