From patchwork Sat Nov 10 14:21:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dong Aisheng X-Patchwork-Id: 995902 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="NdvNeOWM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42sfNX2Xmlz9s9G for ; Sun, 11 Nov 2018 01:22:04 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726753AbeKKAHN (ORCPT ); Sat, 10 Nov 2018 19:07:13 -0500 Received: from mail-eopbgr60059.outbound.protection.outlook.com ([40.107.6.59]:56576 "EHLO EUR04-DB3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726574AbeKKAHN (ORCPT ); Sat, 10 Nov 2018 19:07:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3U4G9OrdmkFpVVw3Bu8bcrAbKRP+6Iz8uArZQSC31ks=; b=NdvNeOWMxCryxUPFtOJpQCa9pWh9EmvZ2anUB4Ek9HP3llAZw/OhHvybNEKNG25mCjg+9jJMav/lsxa4fPwl4Mrs5cXiKwXiK0PSWmcxXuMeDjspuwn4XU0Yt+bZxLEK69FbG8luth0q0E7VQH2U2/+idFOk+VZLJo/7B3kv4Vs= Received: from AM0PR04MB4211.eurprd04.prod.outlook.com (52.134.126.21) by AM0PR04MB5682.eurprd04.prod.outlook.com (20.178.118.215) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.38; Sat, 10 Nov 2018 14:21:19 +0000 Received: from AM0PR04MB4211.eurprd04.prod.outlook.com ([fe80::797a:f972:9281:6d10]) by AM0PR04MB4211.eurprd04.prod.outlook.com ([fe80::797a:f972:9281:6d10%2]) with mapi id 15.20.1294.039; Sat, 10 Nov 2018 14:21:19 +0000 From: "A.s. Dong" To: "linux-gpio@vger.kernel.org" CC: "linux-arm-kernel@lists.infradead.org" , "dongas86@gmail.com" , dl-linux-imx , "A.s. Dong" , Linus Walleij , Stefan Agner , Shawn Guo Subject: [PATCH RESEND V5 1/1] gpio: vf610: add optional clock support Thread-Topic: [PATCH RESEND V5 1/1] gpio: vf610: add optional clock support Thread-Index: AQHUeQClGGEJxZ7i+0WUaYMt9TTlFA== Date: Sat, 10 Nov 2018 14:21:18 +0000 Message-ID: <1541859384-32301-1-git-send-email-aisheng.dong@nxp.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.7.4 x-clientproxiedby: HK0PR03CA0020.apcprd03.prod.outlook.com (2603:1096:203:2e::32) To AM0PR04MB4211.eurprd04.prod.outlook.com (2603:10a6:208:66::21) x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [119.31.174.66] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM0PR04MB5682; 6:92GVg4M/r6fjc52dbfpRK567V0/MvZXoo2Kb+ZkDrrZEViP7Slo/HGPc6MumDFk9fSr3q1nEBU7DaCbhn+fCsaLevQRmZek3lp32Ofv1ZNmGWnpby4n4my6GdRHIA8CH/7Yc5uyHDjKBiXgXwOUqfCoG7ShyFXFigi/u7/PCMamsI6bHdCEGU4cF6Hsu0/cbJ41VSd2cuFh7jU6Zf9NOetFyAyl+Yt6/mLqzgVnDDfQLsy4stQH5csOIxSSlvEOyraDSUYQqsjzGyjz5lNEAsPCssL9nR85TXn94CSxSQle+DNHiylBXpiDlqI+J05I4MSjswhAxD+lPqHoqNfJhY+0TauWOxMail6eX4AkM1FBWpwiSy98gWUxshEI2rWRMDgxMW64HkEz1GDrB5I4KWIXlkffrb+eQA5vt+a/fANtSQCeV8kP29Qf7/2NTaNpjd73Zoi14kHMASd61h49uPQ==; 5:lDyV+ndx7dL3F259/00vQWqj+br721upk+euLU++q/El2MJSmuSb3G5gsmQM5374TdUIF04rOJ8YhI+SGSNgRUILY7vTMLGvhfCdO6ejnYwNQ5CN1xgGbUpnvLO9ad4MxoEIohEsXCF2FzakZoORHN6r4HD2s4o8nLvr8IleOV4=; 7:NOUhlHGuRsFqSknJCZIrwMPgPDDYggeK/8++AR/uhISBxbZ2pPi+yFA2oI5cv63D/O2nWlRQxblbI8msq5LUpeIOL2656x/v9hrK88lnN0WRipJbyF+2OOnd5HKMqQtYWFjkmP5AOMPIInkBztA59Q== x-ms-office365-filtering-correlation-id: d20865d0-1a1d-47b8-873e-08d64717c804 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390040)(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:AM0PR04MB5682; x-ms-traffictypediagnostic: AM0PR04MB5682: authentication-results: spf=none (sender IP is ) smtp.mailfrom=aisheng.dong@nxp.com; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(9452136761055)(185117386973197); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231402)(944501410)(52105095)(93006095)(93001095)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:AM0PR04MB5682; BCL:0; PCL:0; RULEID:; SRVR:AM0PR04MB5682; x-forefront-prvs: 0852EB6797 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(136003)(376002)(366004)(396003)(39850400004)(189003)(199004)(66066001)(105586002)(68736007)(6916009)(2900100001)(6486002)(2351001)(106356001)(86362001)(71200400001)(36756003)(2616005)(6116002)(486006)(102836004)(476003)(71190400001)(186003)(3846002)(26005)(6506007)(217873002)(99286004)(386003)(52116002)(256004)(2906002)(53936002)(305945005)(6436002)(54906003)(316002)(5640700003)(6512007)(2501003)(97736004)(7736002)(39060400002)(14454004)(4326008)(5660300001)(8936002)(81166006)(50226002)(81156014)(8676002)(25786009)(478600001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB5682; H:AM0PR04MB4211.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: BJPjdBoYpl/dSgyM5azgLiveIeF4aodemD8QMCjERFj5jdBJNtsDnFxFBcdAO/I8h7vWAqTPQurYrSPAjbLbykmf4UrxN5zUL3wcxxjKTarxUuFVMJTj0NgAsyXB6O9azdDb495XOkhr+bo4M3HlS3oFGP97rhtlVtK53x+Lj11ZuPXgPl454gxQNTxHVAixJZPnQ4jJuytKfLajd9plRaF4GnV6uoPovOzO5w0kQYfrirQypqPJKaYCJgi/6msmap7g/R+dfO/SXQ2v44hwFmL+wVYe9drWAePIHJhGzskcuWqFoZYSec6n8yv+D615D2GxgJz3rMm221YfnPfzInW1W9pikuxHoiC2T6f5xg8= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: d20865d0-1a1d-47b8-873e-08d64717c804 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Nov 2018 14:21:19.3429 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB5682 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Some SoCs need the gpio clock to be enabled before accessing HW registers. This patch add the optional clock handling. Cc: Linus Walleij Cc: Stefan Agner Cc: Shawn Guo Cc: linux-gpio@vger.kernel.org Signed-off-by: Dong Aisheng --- drivers/gpio/gpio-vf610.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c index 5960396..1b79ebc 100644 --- a/drivers/gpio/gpio-vf610.c +++ b/drivers/gpio/gpio-vf610.c @@ -7,6 +7,7 @@ * Author: Stefan Agner . */ #include +#include #include #include #include @@ -32,6 +33,8 @@ struct vf610_gpio_port { void __iomem *gpio_base; const struct fsl_gpio_soc_data *sdata; u8 irqc[VF610_GPIO_PER_PORT]; + struct clk *clk_port; + struct clk *clk_gpio; int irq; }; @@ -271,6 +274,33 @@ static int vf610_gpio_probe(struct platform_device *pdev) if (port->irq < 0) return port->irq; + port->clk_port = devm_clk_get(&pdev->dev, "port"); + if (!IS_ERR(port->clk_port)) { + ret = clk_prepare_enable(port->clk_port); + if (ret) + return ret; + } else if (port->clk_port == ERR_PTR(-EPROBE_DEFER)) { + /* + * Percolate deferrals, for anything else, + * just live without the clocking. + */ + return PTR_ERR(port->clk_port); + } + + port->clk_gpio = devm_clk_get(&pdev->dev, "gpio"); + if (!IS_ERR(port->clk_gpio)) { + ret = clk_prepare_enable(port->clk_gpio); + if (ret) { + clk_disable_unprepare(port->clk_port); + return ret; + } + } else if (port->clk_gpio == ERR_PTR(-EPROBE_DEFER)) { + clk_disable_unprepare(port->clk_port); + return PTR_ERR(port->clk_gpio); + } + + platform_set_drvdata(pdev, port); + gc = &port->gc; gc->of_node = np; gc->parent = dev; @@ -305,12 +335,26 @@ static int vf610_gpio_probe(struct platform_device *pdev) return 0; } +static int vf610_gpio_remove(struct platform_device *pdev) +{ + struct vf610_gpio_port *port = platform_get_drvdata(pdev); + + gpiochip_remove(&port->gc); + if (!IS_ERR(port->clk_port)) + clk_disable_unprepare(port->clk_port); + if (!IS_ERR(port->clk_gpio)) + clk_disable_unprepare(port->clk_gpio); + + return 0; +} + static struct platform_driver vf610_gpio_driver = { .driver = { .name = "gpio-vf610", .of_match_table = vf610_gpio_dt_ids, }, .probe = vf610_gpio_probe, + .remove = vf610_gpio_remove, }; builtin_platform_driver(vf610_gpio_driver);