From patchwork Sun Mar 6 19:49:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Moritz Fischer X-Patchwork-Id: 592572 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 3FD2714030F for ; Mon, 7 Mar 2016 06:50:18 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ettus-com.20150623.gappssmtp.com header.i=@ettus-com.20150623.gappssmtp.com header.b=OTo/Ei6K; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751519AbcCFTuF (ORCPT ); Sun, 6 Mar 2016 14:50:05 -0500 Received: from mail-ob0-f174.google.com ([209.85.214.174]:36632 "EHLO mail-ob0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750955AbcCFTtr (ORCPT ); Sun, 6 Mar 2016 14:49:47 -0500 Received: by mail-ob0-f174.google.com with SMTP id rt7so89277605obb.3 for ; Sun, 06 Mar 2016 11:49:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ettus-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MRnhniquQ4JzL8weggxcaS13sQCRz2iaISaFbYJgeXs=; b=OTo/Ei6KjVITwihdpu2R0/vIS9ZBbQo3lhDzp6J98MmVi+IPFYHjHISq++UZQDK0DT 0zJnqx/mB0P4xGaEaS4a23G7wn/miz9dKOIcTzG186DHKm0e+nQ011WtIDUN+HzhKvv4 YKyQMGrrhxWF0dY1aWDxs5Ou3/zFB++qge3M88eAvjDCHk2rcgyd7q4mZKqrRld4dge3 kUUTlaZHUHqkZzbuqUTR0ai6SMyYbmpDhShIPfvFvV5M/+lnzRcmZGFMhls0Z7ARDFcy umowbTf2V9MgDET953ZHnxmGCl3Ctbubq2P+UwOpSXMjso2aNKeI+u9y3tkhsTqDkBJC 8yWg== 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:in-reply-to :references; bh=MRnhniquQ4JzL8weggxcaS13sQCRz2iaISaFbYJgeXs=; b=S36KM/+YLvIFBo33n3m17ZEWw50C3cNWad09W5Js1gtyaGxsI2cLn+as/rKVI69yR+ 6o2xyGvvrYh78ScHDYFUgTzTm+wxU8QC4qALXQW/NOVURolHCK76DwC2p/N4zKT45rwo Mt6soeiPtvhvsdJt6K0YH/6TIsKqB1zgWFv6cfvfWJoAamncmpRdxvqN21JFp1G5qokT ZWQ94FIdMqWKxx749dezpoUsgrqDeIp1WxGt+cg0dSmCfQRJ4To0NWCHaO8BpQ39eo1m dUTbjalpJWPI1FSVRxosjmucifot5qb0df8g6icL+CG5bhv7Hq/gAhggu58YxexGI2A9 Vsow== X-Gm-Message-State: AD7BkJIiTi3Ui5NaIsIiBXtc/9ouyAZR0YduHZg1z70ZuV/seli1bewlzXhRyjX1vDsdVruK X-Received: by 10.182.45.167 with SMTP id o7mr11988696obm.19.1457293787163; Sun, 06 Mar 2016 11:49:47 -0800 (PST) Received: from archbook.ni.corp.natinst.com ([2601:647:4b00:de01::921]) by smtp.gmail.com with ESMTPSA id y9sm8501314obg.4.2016.03.06.11.49.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 06 Mar 2016 11:49:46 -0800 (PST) From: Moritz Fischer To: nicolas.ferre@atmel.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Moritz Fischer Subject: [RFC] net: macb: Attempt to make fixed link working on macb Date: Sun, 6 Mar 2016 11:49:38 -0800 Message-Id: <1457293778-13804-2-git-send-email-moritz.fischer@ettus.com> X-Mailer: git-send-email 2.7.2 In-Reply-To: <1457293778-13804-1-git-send-email-moritz.fischer@ettus.com> References: <1457293778-13804-1-git-send-email-moritz.fischer@ettus.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Moritz Fischer --- drivers/net/ethernet/cadence/macb.c | 63 ++++++++++++++++++++++++------------- drivers/net/ethernet/cadence/macb.h | 1 + 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index 50c9410..4a3d45d 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -375,27 +375,37 @@ static int macb_mii_probe(struct net_device *dev) int phy_irq; int ret; - phydev = phy_find_first(bp->mii_bus); - if (!phydev) { - netdev_err(dev, "no PHY found\n"); - return -ENXIO; - } + if (bp->phy_node) { + phydev = of_phy_connect(dev, bp->phy_node, + &macb_handle_link_change, 0, + bp->phy_interface); + if (!phydev) + return -ENODEV; + } else { + phydev = phy_find_first(bp->mii_bus); + if (!phydev) { + netdev_err(dev, "no PHY found\n"); + return -ENXIO; + } - pdata = dev_get_platdata(&bp->pdev->dev); - if (pdata && gpio_is_valid(pdata->phy_irq_pin)) { - ret = devm_gpio_request(&bp->pdev->dev, pdata->phy_irq_pin, "phy int"); - if (!ret) { - phy_irq = gpio_to_irq(pdata->phy_irq_pin); - phydev->irq = (phy_irq < 0) ? PHY_POLL : phy_irq; + pdata = dev_get_platdata(&bp->pdev->dev); + if (pdata && gpio_is_valid(pdata->phy_irq_pin)) { + ret = devm_gpio_request(&bp->pdev->dev, + pdata->phy_irq_pin, "phy int"); + if (!ret) { + phy_irq = gpio_to_irq(pdata->phy_irq_pin); + phydev->irq = (phy_irq < 0) + ? PHY_POLL : phy_irq; + } } - } - /* attach the mac to the phy */ - ret = phy_connect_direct(dev, phydev, &macb_handle_link_change, - bp->phy_interface); - if (ret) { - netdev_err(dev, "Could not attach to PHY\n"); - return ret; + /* attach the mac to the phy */ + ret = phy_connect_direct(dev, phydev, &macb_handle_link_change, + bp->phy_interface); + if (ret) { + netdev_err(dev, "Could not attach to PHY\n"); + return ret; + } } /* mask with MAC supported features */ @@ -2910,14 +2920,21 @@ static int macb_probe(struct platform_device *pdev) macb_get_hwaddr(bp); /* Power up the PHY if there is a GPIO reset */ - phy_node = of_get_next_available_child(np, NULL); - if (phy_node) { + phy_node = of_parse_phandle(np, "phy-handle", 0); + if (!phy_node && of_phy_is_fixed_link(np)) { + err = of_phy_register_fixed_link(np); + if (err < 0) { + dev_err(&pdev->dev, "broken fixed-link specification"); + goto failed_phy; + } + phy_node = of_node_get(np); + bp->phy_node = phy_node; + } else { int gpio = of_get_named_gpio(phy_node, "reset-gpios", 0); if (gpio_is_valid(gpio)) bp->reset_gpio = gpio_to_desc(gpio); gpiod_set_value(bp->reset_gpio, GPIOD_OUT_HIGH); } - of_node_put(phy_node); err = of_get_phy_mode(np); if (err < 0) { @@ -2959,6 +2976,9 @@ static int macb_probe(struct platform_device *pdev) err_out_unregister_netdev: unregister_netdev(dev); +failed_phy: + of_node_put(phy_node); + err_out_free_netdev: free_netdev(dev); @@ -2991,6 +3011,7 @@ static int macb_remove(struct platform_device *pdev) clk_disable_unprepare(bp->tx_clk); clk_disable_unprepare(bp->hclk); clk_disable_unprepare(bp->pclk); + of_node_put(bp->phy_node); free_netdev(dev); } diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h index 0d4ecfc..0373aa47 100644 --- a/drivers/net/ethernet/cadence/macb.h +++ b/drivers/net/ethernet/cadence/macb.h @@ -822,6 +822,7 @@ struct macb { struct mii_bus *mii_bus; struct phy_device *phy_dev; + struct device_node *phy_node; int link; int speed; int duplex;