From patchwork Wed Jul 22 10:13:43 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nimrod Andy X-Patchwork-Id: 498482 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 675E41402C7 for ; Wed, 22 Jul 2015 20:13:59 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933739AbbGVKNy (ORCPT ); Wed, 22 Jul 2015 06:13:54 -0400 Received: from mail-bl2on0108.outbound.protection.outlook.com ([65.55.169.108]:44529 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933154AbbGVKNx (ORCPT ); Wed, 22 Jul 2015 06:13:53 -0400 Received: from BY2PR03CA004.namprd03.prod.outlook.com (10.255.93.21) by BY2PR03MB377.namprd03.prod.outlook.com (10.242.237.12) with Microsoft SMTP Server (TLS) id 15.1.225.13; Wed, 22 Jul 2015 10:13:50 +0000 Received: from BN1AFFO11FD051.protection.gbl (10.255.93.4) by BY2PR03CA004.outlook.office365.com (10.255.93.21) with Microsoft SMTP Server (TLS) id 15.1.219.17 via Frontend Transport; Wed, 22 Jul 2015 10:13:50 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1AFFO11FD051.mail.protection.outlook.com (10.58.53.66) with Microsoft SMTP Server (TLS) id 15.1.213.8 via Frontend Transport; Wed, 22 Jul 2015 10:13:50 +0000 Received: from b54642-OptiPlex-3020.ap.freescale.net (b54642-OptiPlex-3020.ap.freescale.net [10.192.242.158]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t6MADkcm017611; Wed, 22 Jul 2015 03:13:47 -0700 From: Fugang Duan To: CC: , , , Subject: [PATCH v1 net-next 1/1] net: fec: add stop mode request on/off implemention Date: Wed, 22 Jul 2015 18:13:43 +0800 Message-ID: <1437560023-9271-1-git-send-email-b38611@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD051; 1:NoZySWS4jFE7JsPZXVnvLszvMP8vP8IXVyuCJoUzkfo2URYQJgPsHCRT3rbt7giUQqINeIva3tORvcBQPWI/JIyeg+LA/PwtzyqR2oVrGx3xNOi09urUE0csW+arIMuSvrC8zOv8vfBPFhw1zivcGOEl6tbUqAzbOB1Y0es8MS8Kx3QXe1sXwNJYEKGHOr+/eocnnNKvo10h6azpciPCfnnh5fIYNMo1kWFqCzTWiD0QqxS/qLeeQKmBWmquZYs9OetNeramcs3evtIr5Jz8gmdx4QXb0vhZNFssR25rh4rnKBbPklXmV0EviZS1WCrnI0F213DJhnalJlYFr9p5/Pyhm46oDfaSwZgdLYoHBJccKtoWEue9/dpbJuYor0v0VwF2mxcYFDvQB/ytacY2ux8KnmlXd2PYRgGeO2cZMQBYk7B/8EP2XJeJbZjJmrHd X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(189002)(199003)(46102003)(107886002)(5001960100002)(50226001)(85426001)(87936001)(47776003)(19580405001)(106466001)(48376002)(229853001)(19580395003)(6806004)(2351001)(50466002)(92566002)(105606002)(104016003)(50986999)(77096005)(62966003)(77156002)(33646002)(36756003)(189998001)(5003940100001)(42262002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR03MB377; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB377; 2:cxLKYCl3qwRyOuF5Btshpp9Fe3z5dg96MeuRWkfkclnl2KlGE+fKSopWhc+HiLJm0EtRq0KDHTNg30pigj4uXBuck18zk+TRTA2a7Ak7Sym2S0ZGo8GzQV68efPnCAbcu5uqVXFZBnNVP9XGNL5dPz6HqpTyunj8BnptPrQp9N4=; 3:rAeYe+vmOq9d3msoeGWXsTuhiUrEV5vgiDzyt3CJu/3QSggn+UqAEp1cEgsuh98QYZjkwTOUyMUHEnqRfcK396Say671atrXpksngj9eDpczQDaRyhiFiUEHcNUs9CzaSK/gBg+GTCGC7cbXOgSREKRI3fp82nx6lzvLkISMSTp0H27cqg2o6IsBHvhyOsyPS68aLvbK9ngTo9TuPWYctl82u4HWhbHZcR/0mCut+2s=; 25:jqHA6naagTtMhCTT/s8opjrPJ3w8iL6+oeyvScsTYue5ZUUXS2NNW4a5GS6y59f3yze8JsSp0mIJkJsc7NIrH4dsvRpR8ow2cO2VTaERWbQ3o48OoqtfWgmAg+fWJsvGW9j4U26F/7Y6L4rb4mBneqZ48r3l6z7AsmnSQq78GW7trI8cINLVc1Ea+ye1a0QWsmky+0ia8N3EyB+jUKq6aTm0fD5mwSjfRs1mmvlVXPdF3CbwDZNbi+ME1IVDzcK7VZeMBVUpS2ClEUSp3z0Gig== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB377; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB377; 20:B8t8sekTv9EbSlGgi84g8assLZs3GCMGlObYNA+lolXrsGfM0w67QZ4CWvGXhKHeeTnxUqI2Uo5X6B8SmCDxFibFJZ9op2NaQV3oB3WwF/c2NMvM0TB1Fb/f6TdD7oXBtjAlgi7XzNFKBxXYOJcBxxcE9R4Zis0zXsPc/pdHbaJSHU2dB0UAuR/RiDf4n992+3KLFNo0wuXCg3d8vgJ6Tn6ZFA4dKAQEMr8e/ol/ryWDWk0jBi8RLagt873MvWCJZZzvx1wnXDjzU2yVRZtdJCj1KkNosIt0ztCsB7ZUVkSpNTZC3g7BWy4n0+pZ/6C1vOQ23H084jD7y75ALqNZlacGFtoNj1NgaAGd5XuNIoo=; 4:GiuhSCpaV6te9z5697NdAXpP8+RujBdGlRHQwzHPHb4DQYAC0HuTQhg1ommLuhVoWzdiu83ewzNgkJkYVSB1OLZTUyM9WQF3ztGU9HzQv5Mauf9eXoBCKWKVPlHa2cwVPtGKjBjyDg12S0kAIoOXmYMWGOREsi02yPKr3Z1CJzfJbUDE71TVPEgnKcnVjMYXxdxF/BmJZhvHnL8+T7yWW0fnMDSf4THkBOy2suS9omAmm9P3sZ7GcaT9k5ZtbLjYscra5kHdGnEi5e5umb7MRda6EujWaydYC0ZLjUzOMtY= BY2PR03MB377: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BY2PR03MB377; BCL:0; PCL:0; RULEID:; SRVR:BY2PR03MB377; X-Forefront-PRVS: 0645BEB7AA X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB377; 23:3jRIANmHupXfHigG8fit2yJ+KHSjRa8YTT7A1ujDLJtf4LFQW/KQOBaGiWb68Bv3L66EjvgJOZ5y26s8oO0UPe8XYrT1dJWC7DB/rd4Aeq7di6GPG0gb3JpJCIhl4xeZmpVwRGCvRg/MjvosODAkk7R0g4mzscdkIIPXczYKhHlvjCLx1grmhH7YODt3giktu4wvYA2nHpm9EXf8s1AhQODXcoI71QDpYN02YoUjcTcWmhUdpBSKIHwS9I0GPahJdLX3S1quUdopAciOLpCzFf1Nkp4EIopk9Y5r1ocT485WyYZFqAC/gWF/Q1he8F7fZ/hCZrYD1U4x7dU27XVj6lAQOETCSr4kkVgHK7HYIT1+7RwqZtfv6HaaC35w0zez7s1gjuaNYs82t3MyrARrkZir50CRSFoiqui7Pky1xhrFE5vWE6/BYoUC40oPgoCRme6YcvKJnfp14yp6MCp//0B/zLCSpzCyCOMm9EugQTzu4GwUZIWWxc+B1tETYReM2qe2ZJ2lbWS0G5MVpsJ6hC67mhhGfqmn7RxqOnDHUnFtGCuJP73sHvK2cgD1YV0LT+JaH9y5AslMCcoCDYFBJOe8b8JjvmrJr8hg8MenCZW12iGgdJjwyJ7qAznbivw5K2dCobdJV93OYXMCvYTtrsgfnSK7qhNIv3EJ3cJgXrbRhwQVnAdmSjOMCqDuLQbcWk/vfNsj9+jX9gW55jBvtfyKtwlfWNs4A0hS9dd6/Xu5KaDX/MO74fNBAuwWQR0n4VH76B593wWrUTFaxY3VQxr6TJM7R2wwGPFCzXMHCyifPE1SDtWPMsxCGndDmJJgsXgbkXYGVHpYxrmYi43NIoJvNUlZie8cpw5b1jSXa1hEhKYbHGfHFHSJouniR7jFQKXemG0WcNg6pZR+miQ+9Q== X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB377; 5:ggCPKvlhml5ZABUIXkRzvXEUibJFPME8Tln7jeR9XazD8kZkfo2jsNrXQkagr877K95RSZFTUPWJ6tCMY9hCmjIivMT+JB1vGHmh5xT2Hx+lfylV3fhzPhtlZ0PJ5iUvLUUV54HhqEz4Ghd2TkqUkQ==; 24:o/SeibIrPU3us1r8vEsWEMA369LsRTDKF+VZCQJ604jxbnpLCNqJofAc/Ozql+WXAwtbNPcFXEubjcfBfVXQae9Jk0x+I5ZDzEkzZfNA4FY=; 20:EV2SRVBDi04VR42m4OuTKxusMgF5s2yCBh/mcu3Y2qywlKsszFikJu4Rqb9Hd1X2fz9QClgkAQ0txEG41Ws54g== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2015 10:13:50.0672 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB377 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The current driver depends on platform data to implement stop mode request on/off that call api pdata->sleep_mode_enable(). To reduce arch platform redundancy code, since the function only set SOC GPR register bit to request stop mode of/off, so we can move the function into driver. And the specifix GPR register offset and MASK bit can be transferred from DTS. Signed-off-by: Fugang Duan --- Documentation/devicetree/bindings/net/fsl-fec.txt | 3 + drivers/net/ethernet/freescale/fec.h | 8 +++ drivers/net/ethernet/freescale/fec_main.c | 87 +++++++++++++++++++---- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/Documentation/devicetree/bindings/net/fsl-fec.txt b/Documentation/devicetree/bindings/net/fsl-fec.txt index a9eb611..f0936c3 100644 --- a/Documentation/devicetree/bindings/net/fsl-fec.txt +++ b/Documentation/devicetree/bindings/net/fsl-fec.txt @@ -24,6 +24,9 @@ Optional properties: number to 1. - fsl,magic-packet : If present, indicates that the hardware supports waking up via magic packet. +- fsl,wakeup_irq : The property defines the wakeup irq index in enet irq source. +- stop-mode : The property defines gpr register bits of stop mode control, the + format is <&gpr req_gpr req_bit>. Optional subnodes: - mdio : specifies the mdio bus in the FEC, used as a container for phy nodes diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 1eee73c..1a09b68 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -431,6 +431,12 @@ struct bufdesc_ex { /* Controller supports RACC register */ #define FEC_QUIRK_HAS_RACC (1 << 12) +struct fec_enet_stop_mode { + struct regmap *gpr; + u8 req_gpr; + u8 req_bit; +}; + struct fec_enet_priv_tx_q { int index; unsigned char *tx_bounce[TX_RING_SIZE]; @@ -518,6 +524,8 @@ struct fec_enet_private { bool bufdesc_ex; int pause_flag; int wol_flag; + int wake_irq; + struct fec_enet_stop_mode gprctl; u32 quirks; struct napi_struct napi; diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 1f89c59..8ab03f4 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -58,6 +58,8 @@ #include #include #include +#include +#include #include @@ -1099,11 +1101,27 @@ fec_restart(struct net_device *ndev) } +static int fec_enet_stop_mode(struct fec_enet_private *fep, bool enabled) +{ + if (IS_ERR_OR_NULL(fep->gprctl.gpr)) + return 0; + + if (enabled) + regmap_update_bits(fep->gprctl.gpr, fep->gprctl.req_gpr, + 1 << fep->gprctl.req_bit, + 1 << fep->gprctl.req_bit); + else + regmap_update_bits(fep->gprctl.gpr, fep->gprctl.req_gpr, + 1 << fep->gprctl.req_bit, + 0); + + return 0; +} + static void fec_stop(struct net_device *ndev) { struct fec_enet_private *fep = netdev_priv(ndev); - struct fec_platform_data *pdata = fep->pdev->dev.platform_data; u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & (1 << 8); u32 val; @@ -1133,8 +1151,7 @@ fec_stop(struct net_device *ndev) val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP); writel(val, fep->hwp + FEC_ECNTRL); - if (pdata && pdata->sleep_mode_enable) - pdata->sleep_mode_enable(true); + fec_enet_stop_mode(fep, true); } writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); @@ -2578,15 +2595,10 @@ fec_enet_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol) return -EINVAL; device_set_wakeup_enable(&ndev->dev, wol->wolopts & WAKE_MAGIC); - if (device_may_wakeup(&ndev->dev)) { + if (device_may_wakeup(&ndev->dev)) fep->wol_flag |= FEC_WOL_FLAG_ENABLE; - if (fep->irq[0] > 0) - enable_irq_wake(fep->irq[0]); - } else { + else fep->wol_flag &= (~FEC_WOL_FLAG_ENABLE); - if (fep->irq[0] > 0) - disable_irq_wake(fep->irq[0]); - } return 0; } @@ -3267,6 +3279,41 @@ fec_enet_get_queue_num(struct platform_device *pdev, int *num_tx, int *num_rx) } +static void fec_enet_of_parse_stop_mode(struct platform_device *pdev) +{ + struct net_device *dev = platform_get_drvdata(pdev); + struct device_node *np = pdev->dev.of_node; + struct fec_enet_private *fep = netdev_priv(dev); + struct device_node *node; + phandle phandle; + u32 out_val[3]; + int ret; + + ret = of_property_read_u32_array(np, "stop-mode", out_val, 3); + if (ret) { + dev_dbg(&pdev->dev, "no stop-mode property\n"); + return; + } + + phandle = *out_val; + node = of_find_node_by_phandle(phandle); + if (!node) { + dev_dbg(&pdev->dev, "could not find gpr node by phandle\n"); + return; + } + + fep->gprctl.gpr = syscon_node_to_regmap(node); + if (IS_ERR(fep->gprctl.gpr)) { + dev_dbg(&pdev->dev, "could not find gpr regmap\n"); + return; + } + + of_node_put(node); + + fep->gprctl.req_gpr = out_val[1]; + fep->gprctl.req_bit = out_val[2]; +} + static int fec_probe(struct platform_device *pdev) { @@ -3324,6 +3371,8 @@ fec_probe(struct platform_device *pdev) platform_set_drvdata(pdev, ndev); + fec_enet_of_parse_stop_mode(pdev); + if (of_get_property(np, "fsl,magic-packet", NULL)) fep->wol_flag |= FEC_WOL_HAS_MAGIC_PACKET; @@ -3425,6 +3474,12 @@ fec_probe(struct platform_device *pdev) fep->irq[i] = irq; } + ret = of_property_read_u32(np, "fsl,wakeup_irq", &irq); + if (!ret && irq < FEC_IRQ_NUM) + fep->wake_irq = fep->irq[irq]; + else + fep->wake_irq = fep->irq[0]; + init_completion(&fep->mdio_done); ret = fec_enet_mii_init(pdev); if (ret) @@ -3503,8 +3558,12 @@ static int __maybe_unused fec_suspend(struct device *dev) netif_tx_unlock_bh(ndev); fec_stop(ndev); fec_enet_clk_enable(ndev, false); - if (!(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) + if (!(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) { pinctrl_pm_select_sleep_state(&fep->pdev->dev); + } else { + disable_irq(fep->wake_irq); + enable_irq_wake(fep->wake_irq); + } } rtnl_unlock(); @@ -3524,7 +3583,6 @@ static int __maybe_unused fec_resume(struct device *dev) { struct net_device *ndev = dev_get_drvdata(dev); struct fec_enet_private *fep = netdev_priv(ndev); - struct fec_platform_data *pdata = fep->pdev->dev.platform_data; int ret; int val; @@ -3542,8 +3600,9 @@ static int __maybe_unused fec_resume(struct device *dev) goto failed_clk; } if (fep->wol_flag & FEC_WOL_FLAG_ENABLE) { - if (pdata && pdata->sleep_mode_enable) - pdata->sleep_mode_enable(false); + disable_irq_wake(fep->wake_irq); + fec_enet_stop_mode(fep, false); + enable_irq(fep->wake_irq); val = readl(fep->hwp + FEC_ECNTRL); val &= ~(FEC_ECR_MAGICEN | FEC_ECR_SLEEP); writel(val, fep->hwp + FEC_ECNTRL);