From patchwork Tue Feb 18 00:12:43 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergei Shtylyov X-Patchwork-Id: 3666341 Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E9DBFBF13A for ; Mon, 17 Feb 2014 23:12:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CBF25201FE for ; Mon, 17 Feb 2014 23:12:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 99B392020F for ; Mon, 17 Feb 2014 23:12:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752885AbaBQXMv (ORCPT ); Mon, 17 Feb 2014 18:12:51 -0500 Received: from mail-la0-f51.google.com ([209.85.215.51]:61841 "EHLO mail-la0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752371AbaBQXMt (ORCPT ); Mon, 17 Feb 2014 18:12:49 -0500 Received: by mail-la0-f51.google.com with SMTP id c6so11501849lan.24 for ; Mon, 17 Feb 2014 15:12:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:subject:cc:from:organization:date :mime-version:content-type:content-transfer-encoding:message-id; bh=Geqpn2IzfElTqpJWu+faYYY+N7HPMRscWYFcxRdUw7Q=; b=NxG2lqprpOZaXFcvwVJp0HRa9BB8PPTv6ZPeNMj4gJe8yzdSpSLlM2zjipiwtbiDNr uIvgC6/Si3fI8g3g4IuBuF2Lms6L3y8cpoUl2taPSmdPOEZQ3Z3Ho3VFGFj11ZH44ceJ NWckVSRnKQrxIAAJrkG73epRKz7FsMXtpQcz1xAHsXc4k47rnOJf4vS3HVS2VIZ6ZTvS 4KoJYuzSlqRbm7zEAZq7j8eqjZLZCHnuVdsXVxpnS96e+hjC2D9RqJvSPpi6IBqwU6MV 82uJwGe+7oGxGjRZ2xFtFzwvsvYemns60rSlC74gPBgcJ2BhLTWWS8rERJ/k7tHXia7a P5pw== X-Gm-Message-State: ALoCoQlFHqv0keUQ2cN2UjF6QshWuZF6LvI3obf63bP4v1gPgPuGtAlVU/U2r58qQHGpxyVYDUcK X-Received: by 10.112.142.161 with SMTP id rx1mr18052845lbb.33.1392678767619; Mon, 17 Feb 2014 15:12:47 -0800 (PST) Received: from wasted.cogentembedded.com (ppp83-237-60-101.pppoe.mtu-net.ru. [83.237.60.101]) by mx.google.com with ESMTPSA id w2sm28267068lad.4.2014.02.17.15.12.45 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Mon, 17 Feb 2014 15:12:46 -0800 (PST) To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, grant.likely@linaro.org, devicetree@vger.kernel.org, linux-sh@vger.kernel.org, ijc+devicetree@hellion.org.uk, galak@codeaurora.org, netdev@vger.kernel.org Subject: [PATCH v4] sh_eth: add device tree support Cc: nobuhiro.iwamatsu.yj@renesas.com, rob@landley.net, linux-doc@vger.kernel.org From: Sergei Shtylyov Organization: Cogent Embedded Date: Tue, 18 Feb 2014 03:12:43 +0300 MIME-Version: 1.0 Message-Id: <201402180312.44775.sergei.shtylyov@cogentembedded.com> Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add support of the device tree probing for the Renesas SH-Mobile SoCs documenting the device tree binding as necessary. This work is loosely based on the original patch by Nobuhiro Iwamatsu . Signed-off-by: Sergei Shtylyov --- This patch is against DaveM's 'net-next.git' repo but should also apply to the recent 'renesas.git' repo's 'devel' branch. It assumes the patch documenting all Ethernet bindings in one file to be applied as well. Changes in version 4: - removed devm_kfree() call from error path in sh_eth_parse_dt(); - removed error handling for of_match_device() call as it's guaranteed to succeed after DT probing. Changes in version 3: - added probing for R8A7791 and R7S72100; - added irq_of_parse_and_map() call to read PHY IRQ from device tree; - removed '!phy' check before reading the PHY node's "reg" property; - replaced "phy-handle" and "phy-mode" property descriptions with references to the common Ethernet bindings file; - added "clocks" required property; - removed "local-mac-address" optional property; - replaced Armadiallo800EVA board with Lager board in the binding example; - updated driver's copyrights; - refreshed the patch. Changes in version 2: - added sh_eth_match_table[] entry for "renesas,ether-r8a7778", documented it; - clarified descriptions of the "reg" and "interrupt" properties; - moved "interrupt-parent" from required properties to optional; - mentioned the necessary PHY subnode to the "phy-handle" property description, documented the requered "#address-cells" and "#size-cells" properties; - clarified the types/descriptions of the Renesas specific properties; - refreshed the patch. Documentation/devicetree/bindings/net/sh_eth.txt | 55 ++++++++++++++++++ drivers/net/ethernet/renesas/sh_eth.c | 69 ++++++++++++++++++++++- 2 files changed, 121 insertions(+), 3 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: net-next/Documentation/devicetree/bindings/net/sh_eth.txt =================================================================== --- /dev/null +++ net-next/Documentation/devicetree/bindings/net/sh_eth.txt @@ -0,0 +1,55 @@ +* Renesas Electronics SH EtherMAC + +This file provides information on what the device node for the SH EtherMAC +interface contains. + +Required properties: +- compatible: "renesas,gether-r8a7740" if the device is a part of R8A7740 SoC. + "renesas,ether-r8a7778" if the device is a part of R8A7778 SoC. + "renesas,ether-r8a7779" if the device is a part of R8A7779 SoC. + "renesas,ether-r8a7790" if the device is a part of R8A7790 SoC. + "renesas,ether-r8a7791" if the device is a part of R8A7791 SoC. + "renesas,ether-r7s72100" if the device is a part of R7S72100 SoC. +- reg: offset and length of (1) the E-DMAC/feLic register block (required), + (2) the TSU register block (optional). +- interrupts: interrupt specifier for the sole interrupt. +- phy-mode: see ethernet.txt file in the same directory. +- phy-handle: see ethernet.txt file in the same directory. +- #address-cells: number of address cells for the MDIO bus, must be equal to 1. +- #size-cells: number of size cells on the MDIO bus, must be equal to 0. +- clocks: clock phandle and specifier pair. +- pinctrl-0: phandle, referring to a default pin configuration node. + +Optional properties: +- interrupt-parent: the phandle for the interrupt controller that services + interrupts for this device. +- pinctrl-names: pin configuration state name ("default"). +- renesas,no-ether-link: boolean, specify when a board does not provide a proper + Ether LINK signal. +- renesas,ether-link-active-low: boolean, specify when the Ether LINK signal is + active-low instead of normal active-high. + +Example (Lager board): + + ethernet@ee700000 { + compatible = "renesas,ether-r8a7790"; + reg = <0 0xee700000 0 0x400>; + interrupt-parent = <&gic>; + interrupts = <0 162 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&mstp8_clks R8A7790_CLK_ETHER>; + phy-mode = "rmii"; + phy-handle = <&phy1>; + pinctrl-0 = <ðer_pins>; + pinctrl-names = "default"; + renesas,ether-link-active-low; + #address-cells = <1>; + #size-cells = <0>; + + phy1: ethernet-phy@1 { + reg = <1>; + interrupt-parent = <&irqc0>; + interrupts = <0 IRQ_TYPE_LEVEL_LOW>; + pinctrl-0 = <&phy1_pins>; + pinctrl-names = "default"; + }; + }; Index: net-next/drivers/net/ethernet/renesas/sh_eth.c =================================================================== --- net-next.orig/drivers/net/ethernet/renesas/sh_eth.c +++ net-next/drivers/net/ethernet/renesas/sh_eth.c @@ -1,8 +1,8 @@ /* SuperH Ethernet device driver * * Copyright (C) 2006-2012 Nobuhiro Iwamatsu - * Copyright (C) 2008-2013 Renesas Solutions Corp. - * Copyright (C) 2013 Cogent Embedded, Inc. + * Copyright (C) 2008-2014 Renesas Solutions Corp. + * Copyright (C) 2013-2014 Cogent Embedded, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -27,6 +27,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -2710,6 +2714,54 @@ static const struct net_device_ops sh_et .ndo_change_mtu = eth_change_mtu, }; +#ifdef CONFIG_OF +static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct sh_eth_plat_data *pdata; + struct device_node *phy; + const char *mac_addr; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return NULL; + + pdata->phy_interface = of_get_phy_mode(np); + + phy = of_parse_phandle(np, "phy-handle", 0); + if (of_property_read_u32(phy, "reg", &pdata->phy)) + return NULL; + pdata->phy_irq = irq_of_parse_and_map(phy, 0); + + mac_addr = of_get_mac_address(np); + if (mac_addr) + memcpy(pdata->mac_addr, mac_addr, ETH_ALEN); + + pdata->no_ether_link = + of_property_read_bool(np, "renesas,no-ether-link"); + pdata->ether_link_active_low = + of_property_read_bool(np, "renesas,ether-link-active-low"); + + return pdata; +} + +static const struct of_device_id sh_eth_match_table[] = { + { .compatible = "renesas,gether-r8a7740", .data = &r8a7740_data }, + { .compatible = "renesas,ether-r8a7778", .data = &r8a777x_data }, + { .compatible = "renesas,ether-r8a7779", .data = &r8a777x_data }, + { .compatible = "renesas,ether-r8a7790", .data = &r8a779x_data }, + { .compatible = "renesas,ether-r8a7791", .data = &r8a779x_data }, + { .compatible = "renesas,ether-r7s72100", .data = &r7s72100_data }, + { } +}; +MODULE_DEVICE_TABLE(of, sh_eth_match_table); +#else +static inline struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) +{ + return NULL; +} +#endif + static int sh_eth_drv_probe(struct platform_device *pdev) { int ret, devno = 0; @@ -2763,6 +2815,8 @@ static int sh_eth_drv_probe(struct platf pm_runtime_enable(&pdev->dev); pm_runtime_resume(&pdev->dev); + if (pdev->dev.of_node) + pd = sh_eth_parse_dt(&pdev->dev); if (!pd) { dev_err(&pdev->dev, "no platform data\n"); ret = -EINVAL; @@ -2778,7 +2832,15 @@ static int sh_eth_drv_probe(struct platf mdp->ether_link_active_low = pd->ether_link_active_low; /* set cpu data */ - mdp->cd = (struct sh_eth_cpu_data *)id->driver_data; + if (id) { + mdp->cd = (struct sh_eth_cpu_data *)id->driver_data; + } else { + const struct of_device_id *match; + + match = of_match_device(of_match_ptr(sh_eth_match_table), + &pdev->dev); + mdp->cd = (struct sh_eth_cpu_data *)match->data; + } mdp->reg_offset = sh_eth_get_register_offset(mdp->cd->register_type); sh_eth_set_default_cpu_data(mdp->cd); @@ -2920,6 +2982,7 @@ static struct platform_driver sh_eth_dri .driver = { .name = CARDNAME, .pm = SH_ETH_PM_OPS, + .of_match_table = of_match_ptr(sh_eth_match_table), }, };