From patchwork Thu Feb 18 09:59:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 584589 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 6E6B11402AC for ; Thu, 18 Feb 2016 20:59:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1425970AbcBRJ7N (ORCPT ); Thu, 18 Feb 2016 04:59:13 -0500 Received: from mail-wm0-f53.google.com ([74.125.82.53]:37985 "EHLO mail-wm0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1425918AbcBRJ7K (ORCPT ); Thu, 18 Feb 2016 04:59:10 -0500 Received: by mail-wm0-f53.google.com with SMTP id a4so17048620wme.1 for ; Thu, 18 Feb 2016 01:59:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=+gjYMqTE6cv0yLlSL5JRhFCmu4lQmA+AA4faXiEUgcU=; b=X6G3a21PoqpavgZQkYXHssmkmbuNrVwTt71rMP5md6HwdYnCxBuI+pi8tWiWMeQ7HZ zqVBo8pnD3rZdfLyLoQJO+Mg4vvjIt+7krGsrj1Inl9BDBTI8Pip1LTWT7F+xszsvUU4 RG4MVqFKc1In1Yc5i5yW6UzTggYNYKO7+I7HMObvo9iYbYJWcaErn8LUvvJMlaIKsTWX hIRfggLEjhpur2KlAJKgKilWFwfdE7ZmtMAl/7UTgIy1uLvPI/9DmtjD9TQH4GBgVyWL OjbX2k5GW1yLuKaWnGo2IwA4bfdB3TvWOZykDlmcMqMJY743vF2ff1zCfC+b8CO5a3m1 4lZA== X-Gm-Message-State: AG10YOTwmHvN7Y52dfCH48c/pwNnJdbJc0HfZyyVzGuefUGsXc1fJCHeltvuAHDLFzz9YQ== X-Received: by 10.28.63.200 with SMTP id m191mr2265837wma.21.1455789549108; Thu, 18 Feb 2016 01:59:09 -0800 (PST) Received: from stefan-work.domain_not_set.invalid (b9168f50.cgn.dg-w.de. [185.22.143.80]) by smtp.gmail.com with ESMTPSA id ko2sm5749617wjc.9.2016.02.18.01.59.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 18 Feb 2016 01:59:08 -0800 (PST) From: Stefan Roese To: netdev@vger.kernel.org Cc: Andrew Lunn , Florian Fainelli , "David S . Miller" Subject: [PATCH] net: phy: Add SGMII support for Marvell 88E1510/1512/1514/1518 Date: Thu, 18 Feb 2016 10:59:07 +0100 Message-Id: <1455789547-6382-1-git-send-email-sr@denx.de> X-Mailer: git-send-email 2.7.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add code to select SGMII-to-copper mode upon SGMII interface selection. Signed-off-by: Stefan Roese Cc: Andrew Lunn Cc: Florian Fainelli Cc: David S. Miller --- drivers/net/phy/marvell.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index e3eb964..1dcbd3f 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -133,6 +133,11 @@ #define MII_88E3016_DISABLE_SCRAMBLER 0x0200 #define MII_88E3016_AUTO_MDIX_CROSSOVER 0x0030 +#define MII_88E1510_GEN_CTRL_REG_1 0x14 +#define MII_88E1510_GEN_CTRL_REG_1_MODE_MASK 0x7 +#define MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII 0x1 /* SGMII to copper */ +#define MII_88E1510_GEN_CTRL_REG_1_RESET 0x8000 /* Soft reset */ + MODULE_DESCRIPTION("Marvell PHY driver"); MODULE_AUTHOR("Andy Fleming"); MODULE_LICENSE("GPL"); @@ -438,6 +443,41 @@ static int m88e1318_config_aneg(struct phy_device *phydev) return m88e1121_config_aneg(phydev); } +static int m88e1510_config_init(struct phy_device *phydev) +{ + int err; + int temp; + + /* SGMII-to-Copper mode initialization */ + if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { + /* Select page 18 */ + err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 18); + if (err < 0) + return err; + + /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ + temp = phy_read(phydev, MII_88E1510_GEN_CTRL_REG_1); + temp &= ~MII_88E1510_GEN_CTRL_REG_1_MODE_MASK; + temp |= MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII; + err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp); + if (err < 0) + return err; + + /* PHY reset is necessary after changing MODE[2:0] */ + temp |= MII_88E1510_GEN_CTRL_REG_1_RESET; + err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp); + if (err < 0) + return err; + + /* Reset page selection */ + err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); + if (err < 0) + return err; + } + + return 0; +} + static int m88e1510_config_aneg(struct phy_device *phydev) { int err; @@ -1259,6 +1299,7 @@ static struct phy_driver marvell_drivers[] = { .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .probe = marvell_probe, + .config_init = &m88e1510_config_init, .config_aneg = &m88e1510_config_aneg, .read_status = &marvell_read_status, .ack_interrupt = &marvell_ack_interrupt,