From patchwork Fri Nov 18 14:29:25 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean-Christophe PLAGNIOL-VILLARD X-Patchwork-Id: 126422 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 A0CBCB7261 for ; Sat, 19 Nov 2011 01:56:02 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757958Ab1KROz5 (ORCPT ); Fri, 18 Nov 2011 09:55:57 -0500 Received: from mo2.mail-out.ovh.net ([178.32.228.2]:39674 "EHLO mo2.mail-out.ovh.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756797Ab1KROz4 (ORCPT ); Fri, 18 Nov 2011 09:55:56 -0500 Received: from mail190.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo2.mail-out.ovh.net (Postfix) with SMTP id 5F878DCB0B1 for ; Fri, 18 Nov 2011 15:37:51 +0100 (CET) Received: from b0.ovh.net (HELO queueout) (213.186.33.50) by b0.ovh.net with SMTP; 18 Nov 2011 16:31:38 +0200 Received: from ns32433.ovh.net (HELO localhost) (plagnioj%jcrosoft.com@213.251.161.87) by ns0.ovh.net with SMTP; 18 Nov 2011 16:31:34 +0200 From: Jean-Christophe PLAGNIOL-VILLARD To: devicetree-discuss@ozlabs.org Cc: netdev@vger.kernel.org, Jean-Christophe PLAGNIOL-VILLARD , Jamie Iles , Nicolas Ferre X-Ovh-Mailout: 178.32.228.2 (mo2.mail-out.ovh.net) Subject: [PATCH 1/1] net/macb: add DT support Date: Fri, 18 Nov 2011 15:29:25 +0100 Message-Id: <1321626565-11261-1-git-send-email-plagnioj@jcrosoft.com> X-Mailer: git-send-email 1.7.2.3 X-Ovh-Tracer-Id: 7801923405331737485 X-Ovh-Remote: 213.251.161.87 (ns32433.ovh.net) X-Ovh-Local: 213.186.33.20 (ns0.ovh.net) X-OVH-SPAMSTATE: OK X-OVH-SPAMSCORE: -330 X-OVH-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeefhedrudegucetggdotefuucfrrhhofhhilhgvmecuqfggjfenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnehlihhnuhigfeigucdlqdeftddmnehvohhiugdptghhrghrucdlqddutddtmdenvhhoihgupdhinhhtucdlqddutddtmd X-Spam-Check: DONE|U 0.5/N X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -330 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeefhedrudegucetggdotefuucfrrhhofhhilhgvmecuqfggjfenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnehlihhnuhigfeigucdlqdeftddmnehvohhiugdptghhrghrucdlqddutddtmdenvhhoihgupdhinhhtucdlqddutddtmd Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org allow the DT to pass the mac address and the phy mode Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Cc: Jamie Iles Cc: Nicolas Ferre --- Documentation/devicetree/bindings/net/macb.txt | 22 ++++++++ drivers/net/ethernet/cadence/macb.c | 65 +++++++++++++++++++++--- drivers/net/ethernet/cadence/macb.h | 2 + 3 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 Documentation/devicetree/bindings/net/macb.txt diff --git a/Documentation/devicetree/bindings/net/macb.txt b/Documentation/devicetree/bindings/net/macb.txt new file mode 100644 index 0000000..2b727ec --- /dev/null +++ b/Documentation/devicetree/bindings/net/macb.txt @@ -0,0 +1,22 @@ +* Cadence EMACB + +Implemeted on Atmel AT91 & AVR32 SoC + +Required properties: +- compatible : Should be "atmel,macb" for Atmel +- reg : Address and length of the register set for the device +- interrupts : Should contain macb interrupt +- phy-mode : String, operation mode of the PHY interface. + Supported values are: "mii", "rmii", + +Optional properties: +- local-mac-address : 6 bytes, mac address + +Examples: + + macb0: macb@fffc4000 { + compatible = "atmel,macb"; + reg = ; + interrupts = <21>; + phy-mode = "mii"; + }; diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index a437b46..2c345bc 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include #include #include @@ -81,6 +84,20 @@ static void __init macb_get_hwaddr(struct macb *bp) addr[4] = top & 0xff; addr[5] = (top >> 8) & 0xff; +#ifdef CONFIG_OF + /* + * 2) from device tree data + */ + if (!is_valid_ether_addr(addr)) { + struct device_node *np = bp->pdev->dev.of_node; + if (np) { + const char *mac = of_get_mac_address(np); + if (mac) + memcpy(addr, mac, sizeof(addr)); + } + } +#endif + if (is_valid_ether_addr(addr)) { memcpy(bp->dev->dev_addr, addr, sizeof(addr)); } else { @@ -191,7 +208,6 @@ static int macb_mii_probe(struct net_device *dev) { struct macb *bp = netdev_priv(dev); struct phy_device *phydev; - struct eth_platform_data *pdata; int ret; phydev = phy_find_first(bp->mii_bus); @@ -200,14 +216,11 @@ static int macb_mii_probe(struct net_device *dev) return -1; } - pdata = bp->pdev->dev.platform_data; /* TODO : add pin_irq */ /* attach the mac to the phy */ ret = phy_connect_direct(dev, phydev, &macb_handle_link_change, 0, - pdata && pdata->is_rmii ? - PHY_INTERFACE_MODE_RMII : - PHY_INTERFACE_MODE_MII); + bp->phy_interface); if (ret) { printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); return ret; @@ -1117,6 +1130,30 @@ static const struct net_device_ops macb_netdev_ops = { #endif }; +#if defined(CONFIG_OF) +static const struct of_device_id macb_dt_ids[] = { + { .compatible = "atmel,macb" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, macb_dt_ids); + +static int __devinit macb_get_phy_mode_dt(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + + if (np) + return of_get_phy_mode(np); + + return -ENODEV; +} +#else +static int __devinit macb_get_phy_mode_dt(struct platform_device *pdev) +{ + return -ENODEV; +} +#endif + static int __init macb_probe(struct platform_device *pdev) { struct eth_platform_data *pdata; @@ -1210,20 +1247,31 @@ static int __init macb_probe(struct platform_device *pdev) macb_writel(bp, NCFGR, config); macb_get_hwaddr(bp); - pdata = pdev->dev.platform_data; - if (pdata && pdata->is_rmii) + err = macb_get_phy_mode_dt(pdev); + if (err < 0) { + pdata = pdev->dev.platform_data; + if (pdata && pdata->is_rmii) + bp->phy_interface = PHY_INTERFACE_MODE_RMII; + else + bp->phy_interface = PHY_INTERFACE_MODE_MII; + } else { + bp->phy_interface = err; + } + + if (bp->phy_interface == PHY_INTERFACE_MODE_RMII) { #if defined(CONFIG_ARCH_AT91) macb_writel(bp, USRIO, (MACB_BIT(RMII) | MACB_BIT(CLKEN)) ); #else macb_writel(bp, USRIO, 0); #endif - else + } else { #if defined(CONFIG_ARCH_AT91) macb_writel(bp, USRIO, MACB_BIT(CLKEN)); #else macb_writel(bp, USRIO, MACB_BIT(MII)); #endif + } bp->tx_pending = DEF_TX_RING_PENDING; @@ -1344,6 +1392,7 @@ static struct platform_driver macb_driver = { .driver = { .name = "macb", .owner = THIS_MODULE, + .of_match_table = of_match_ptr(macb_dt_ids), }, }; diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h index d3212f6..8342744 100644 --- a/drivers/net/ethernet/cadence/macb.h +++ b/drivers/net/ethernet/cadence/macb.h @@ -389,6 +389,8 @@ struct macb { unsigned int link; unsigned int speed; unsigned int duplex; + + phy_interface_t phy_interface; }; #endif /* _MACB_H */