From patchwork Tue May 23 13:33:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 765980 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3wXGjf56Tlz9sPJ for ; Tue, 23 May 2017 23:35:01 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iwvaG9he"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id 6508EC21CC8; Tue, 23 May 2017 13:34:57 +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=FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, 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 B90F4C21C4E; Tue, 23 May 2017 13:34:53 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E2CFCC21C4E; Tue, 23 May 2017 13:34:52 +0000 (UTC) Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by lists.denx.de (Postfix) with ESMTPS id 2E3BAC21C35 for ; Tue, 23 May 2017 13:34:52 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id f27so27714489pfe.0 for ; Tue, 23 May 2017 06:34:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=jvW/cPrpY/fOq3fEtv9IAxEwITudZR1YGtYOxrtc5Gw=; b=iwvaG9heyVVQie3IoA63whzqclxA6XWfg3uKDrmhoixx2T2lnWWORF/z7J11yXKde4 eI8DDHrYn1UuOew8egeSgXvwTn1EmbhYxHJ6A56+mg6IJDiVRXvKtbW/PEupug2oNzB+ enOh5n2+PHDdHpChznrwmihXAM1waYq10jAK/Eu1jWT3f7jMh/vWxatOGFFR3+9tuk0t IocGqii8HBfW0jGXTGTwVuArv10b4x7ObmvNsvbAHo0RyM+Y2ITAWFpt94boMFJ0hVf/ vfi3+3UvGkzBVGN9eZ98YaYOfN7jYE+//OrqgaLdmcyyYfpKqpCMMOIWYI4EnkjhQRWN 2P+w== 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; bh=jvW/cPrpY/fOq3fEtv9IAxEwITudZR1YGtYOxrtc5Gw=; b=WP0yGQWj9raHI/hBE6C8UhChVTJs2mprB4prdcq4hZOHIKHu7wfY5cyWR8tjOCXcWK ErPmJNZNFbZz5wt45O54Br0mpXzOWA8ftq4pzCYnt7ovWwiBvMwL8dKglAeWhMAL9HwM ZgqsGbe1jiA30s/M18SU6ko5F0TegiBP8n8Hwj6OXJgEWNh5VEMKHcF06HxvYoUzP1n/ 0sXx++x3S6mEIOEjnvQvSDokWLs4ZXiIXspL5Q0+F9wVhzsaVVV+luQpldtEAZIAa7ad e+biPHV/Ej2ienX4sC9MxFYHL3nkYfinXAl9yVfCttvkv0/QKTbCVZjyHVzo7DK+N6YS n9zw== X-Gm-Message-State: AODbwcCpXWQusbJD6fMiavGH2B/QvZ8xTisBFhIY4g0y2VehfA1rZbVm Btvphoc7n202WA== X-Received: by 10.98.16.215 with SMTP id 84mr31422291pfq.210.1495546490383; Tue, 23 May 2017 06:34:50 -0700 (PDT) Received: from localhost.localdomain ([59.95.77.114]) by smtp.gmail.com with ESMTPSA id z21sm1589072pgc.15.2017.05.23.06.34.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 23 May 2017 06:34:49 -0700 (PDT) From: Jagan Teki X-Google-Original-From: Jagan Teki To: Stefano Babic Date: Tue, 23 May 2017 19:03:45 +0530 Message-Id: <1495546425-753-1-git-send-email-jteki@openedev.com> X-Mailer: git-send-email 2.7.4 Cc: Fabio Estevam , u-boot@lists.denx.de, Jagan Teki , Joe Hershberger Subject: [U-Boot] [PATCH v8 14/17] net: fec_mxc: Add fec_phy_reset support 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: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Jagan Teki phy-reset-gpios and phy-reset-duration properties are needed for adding mii_dev reset bus operation, so the board code not take care of phy_reset anymore if it use DM_ETH. Cc: Joe Hershberger Cc: Fabio Estevam Signed-off-by: Jagan Teki --- Changes for v8: - Add 'phy-reset-duration' property support drivers/net/fec_mxc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++----- drivers/net/fec_mxc.h | 9 ++++++ include/netdev.h | 5 ++++ 3 files changed, 89 insertions(+), 8 deletions(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 08bea8b..17fe27f 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -180,13 +180,27 @@ static int fec_mdio_write(struct ethernet_regs *eth, uint8_t phyaddr, static int fec_phy_read(struct mii_dev *bus, int phyaddr, int dev_addr, int regaddr) { - return fec_mdio_read(bus->priv, phyaddr, regaddr); +#ifdef CONFIG_DM_ETH + struct fec_priv *priv = dev_get_priv((struct udevice *)bus->priv); + struct ethernet_regs *eth = priv->eth; +#else + struct ethernet_regs *eth = bus->priv; +#endif + + return fec_mdio_read(eth, phyaddr, regaddr); } static int fec_phy_write(struct mii_dev *bus, int phyaddr, int dev_addr, int regaddr, u16 data) { - return fec_mdio_write(bus->priv, phyaddr, regaddr, data); +#ifdef CONFIG_DM_ETH + struct fec_priv *priv = dev_get_priv((struct udevice *)bus->priv); + struct ethernet_regs *eth = priv->eth; +#else + struct ethernet_regs *eth = bus->priv; +#endif + + return fec_mdio_write(eth, phyaddr, regaddr, data); } #ifndef CONFIG_PHYLIB @@ -985,9 +999,44 @@ static void fec_free_descs(struct fec_priv *fec) free(fec->tbd_base); } +#if defined(CONFIG_DM_ETH) && defined(CONFIG_DM_GPIO) +static int fec_phy_reset(struct mii_dev *bus) +{ + struct fec_priv *priv = dev_get_priv((struct udevice *)bus->priv); + int ret; + + if (!dm_gpio_is_valid(&priv->reset_gpio)) + return 0; + + /* phy reset */ + ret = dm_gpio_set_value(&priv->reset_gpio, 0); + if (ret) + return ret; + + mdelay(priv->reset_duration); + + ret = dm_gpio_set_value(&priv->reset_gpio, 1); + if (ret) + return ret; + + mdelay(priv->reset_duration); + + return 0; +} +#endif + +#ifdef CONFIG_DM_ETH +struct mii_dev *fec_get_miibus(struct udevice *dev, int dev_id) +#else struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id) +#endif { +#ifdef CONFIG_DM_ETH + struct fec_priv *priv = dev_get_priv(dev); + struct ethernet_regs *eth = priv->eth; +#else struct ethernet_regs *eth = (struct ethernet_regs *)base_addr; +#endif struct mii_dev *bus; int ret; @@ -998,7 +1047,14 @@ struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id) } bus->read = fec_phy_read; bus->write = fec_phy_write; +#ifdef CONFIG_DM_ETH + bus->priv = dev; +# ifdef CONFIG_DM_GPIO + bus->reset = fec_phy_reset; +# endif +#else bus->priv = eth; +#endif fec_set_dev_name(bus->name, dev_id); ret = mdio_register(bus); @@ -1223,7 +1279,7 @@ static int fecmxc_probe(struct udevice *dev) if (ret) return ret; - bus = fec_get_miibus((uint32_t)priv->eth, dev_id); + bus = fec_get_miibus(dev, dev_id); if (!bus) goto err_mii; @@ -1278,6 +1334,7 @@ static int fecmxc_ofdata_to_platdata(struct udevice *dev) struct eth_pdata *pdata = dev_get_platdata(dev); struct fec_priv *priv = dev_get_priv(dev); const char *phy_mode; + int ret = 0; pdata->iobase = (phys_addr_t)dev_get_addr(dev); priv->eth = (struct ethernet_regs *)pdata->iobase; @@ -1292,12 +1349,22 @@ static int fecmxc_ofdata_to_platdata(struct udevice *dev) return -EINVAL; } - /* TODO - * Need to get the reset-gpio and related properties from DT - * and implemet the enet reset code on .probe call - */ +#ifdef CONFIG_DM_GPIO + /* phy reset gpio */ + ret = gpio_request_by_name(dev, "phy-reset-gpios", 0, + &priv->reset_gpio, GPIOD_IS_OUT); + if (ret == 0) { + priv->reset_duration = fdtdec_get_int(gd->fdt_blob, + dev_of_offset(dev), + "phy-reset-duration", 1); + /* A sane reset duration should not be longer than 1s */ + if (priv->reset_duration > 1000) + priv->reset_duration = 1; + ret = 0; + } +#endif - return 0; + return ret; } static const struct udevice_id fecmxc_ids[] = { diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h index 43a7d7b..fd51d6d 100644 --- a/drivers/net/fec_mxc.h +++ b/drivers/net/fec_mxc.h @@ -17,6 +17,10 @@ #ifndef __FEC_MXC_H #define __FEC_MXC_H +#ifdef CONFIG_DM_GPIO +# include +#endif + /* Layout description of the FEC */ struct ethernet_regs { /* [10:2]addr = 00 */ @@ -254,6 +258,11 @@ struct fec_priv { #ifdef CONFIG_DM_ETH u32 interface; + +# ifdef CONFIG_DM_GPIO + struct gpio_desc reset_gpio; + u32 reset_duration; +# endif #endif }; diff --git a/include/netdev.h b/include/netdev.h index 8eb8b46..e5668f4 100644 --- a/include/netdev.h +++ b/include/netdev.h @@ -133,7 +133,12 @@ static inline int pci_eth_init(bd_t *bis) return num; } +#ifdef CONFIG_DM_ETH +struct mii_dev *fec_get_miibus(struct udevice *dev, int dev_id); +#else struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id); +#endif + #ifdef CONFIG_PHYLIB struct phy_device; int fec_probe(bd_t *bd, int dev_id, uint32_t base_addr,