From patchwork Thu Mar 12 09:56:43 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sonic Zhang X-Patchwork-Id: 449370 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 1AA71140083 for ; Thu, 12 Mar 2015 21:31:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753191AbbCLKbX (ORCPT ); Thu, 12 Mar 2015 06:31:23 -0400 Received: from mail-by2on0097.outbound.protection.outlook.com ([207.46.100.97]:48128 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751267AbbCLKbW (ORCPT ); Thu, 12 Mar 2015 06:31:22 -0400 Received: from CO2PR03CA0028.namprd03.prod.outlook.com (10.141.194.155) by BY2PR0301MB0757.namprd03.prod.outlook.com (25.160.63.26) with Microsoft SMTP Server (TLS) id 15.1.106.15; Thu, 12 Mar 2015 09:59:37 +0000 Received: from BY2FFO11FD037.protection.gbl (2a01:111:f400:7c0c::154) by CO2PR03CA0028.outlook.office365.com (2a01:111:e400:1414::27) with Microsoft SMTP Server (TLS) id 15.1.112.19 via Frontend Transport; Thu, 12 Mar 2015 09:59:37 +0000 Received: from nwd2mta2.analog.com (137.71.25.57) by BY2FFO11FD037.mail.protection.outlook.com (10.1.14.222) with Microsoft SMTP Server (TLS) id 15.1.112.13 via Frontend Transport; Thu, 12 Mar 2015 09:59:36 +0000 Received: from NWD2HUBCAS9.ad.analog.com (nwd2hubcas9.ad.analog.com [10.64.72.142]) by nwd2mta2.analog.com (8.13.8/8.13.8) with ESMTP id t2CDCDVd013682 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Thu, 12 Mar 2015 09:12:13 -0400 Received: from zeus.spd.analog.com (10.64.82.11) by NWD2HUBCAS9.ad.analog.com (10.64.72.142) with Microsoft SMTP Server id 14.3.210.2; Thu, 12 Mar 2015 05:58:22 -0400 Received: from linux.site ([10.99.22.20]) by zeus.spd.analog.com (8.14.6/8.14.6) with ESMTP id t2C9wLkF016009; Thu, 12 Mar 2015 05:58:21 -0400 Received: from nine.ad.analog.com (unknown [10.99.24.95]) by linux.site (Postfix) with ESMTP id DB1B83B01064; Wed, 11 Mar 2015 19:02:55 -0700 (MST) From: Sonic Zhang To: Linus Walleij , Grant Likely , Steven Miao , CC: , Sonic Zhang Subject: [PATCH] pinmux: allow exlusive pin allocation among GPIO and peripheral funtions via flag strict in struct pinctrl_desc Date: Thu, 12 Mar 2015 17:56:43 +0800 Message-ID: <1426154203-11551-1-git-send-email-sonic.adi@gmail.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Matching-Connectors: 130706279769422621; (52f37747-95c3-483a-bd05-08d153b03fac); () Received-SPF: SoftFail (protection.outlook.com: domain of transitioning gmail.com discourages use of 137.71.25.57 as permitted sender) Authentication-Results: spf=softfail (sender IP is 137.71.25.57) smtp.mailfrom=sonic.adi@gmail.com; lists.sourceforge.net; dkim=none (message not signed) header.d=none; X-Forefront-Antispam-Report: CIP:137.71.25.57; CTRY:US; IPV:NLI; EFV:NLI; BMV:1; SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(47776003)(33646002)(61266001)(92566002)(48376002)(50466002)(6806004)(105596002)(19580395003)(19580405001)(229853001)(50226001)(106466001)(87572001)(50986999)(83322999)(87936001)(86362001)(77096005)(62966003)(77156002)(46102003)(76482003)(73972006)(81442002)(73392002)(55446002)(82202001)(36756003); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB0757; H:nwd2mta2.analog.com; FPR:; SPF:SoftFail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB0757; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5002009)(5005006); SRVR:BY2PR0301MB0757; BCL:0; PCL:0; RULEID:(401004)(400005); SRVR:BY2PR0301MB0757; X-Forefront-PRVS: 05134F8B4F X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Mar 2015 09:59:36.5210 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[137.71.25.57]; Helo=[nwd2mta2.analog.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB0757 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org From: Sonic Zhang The blackfin pinmux and gpio controller doesn't allow user to set up 1 pin for both GPIO and peripheral function. So, add flag strict in struct pinctrl to check both gpio_owner and mux_owner before approving the pin request. Signed-off-by: Sonic Zhang --- drivers/pinctrl/pinctrl-adi2.c | 1 + drivers/pinctrl/pinmux.c | 29 +++++++++++++++-------------- include/linux/pinctrl/pinctrl.h | 1 + 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c index 8434439..fbd4926 100644 --- a/drivers/pinctrl/pinctrl-adi2.c +++ b/drivers/pinctrl/pinctrl-adi2.c @@ -710,6 +710,7 @@ static struct pinctrl_desc adi_pinmux_desc = { .name = DRIVER_NAME, .pctlops = &adi_pctrl_ops, .pmxops = &adi_pinmux_ops, + .strict = true, .owner = THIS_MODULE, }; diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index b874458..dfa2b42 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c @@ -99,24 +99,25 @@ static int pin_request(struct pinctrl_dev *pctldev, dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", pin, desc->name, owner); + if ((gpio_range || pctldev->desc->strict) && desc->gpio_owner) { + dev_err(pctldev->dev, + "pin %s already requested by %s; cannot claim for %s\n", + desc->name, desc->gpio_owner, owner); + goto out; + } + + if ((!gpio_range || pctldev->desc->strict) && + desc->mux_usecount && strcmp(desc->mux_owner, owner)) { + dev_err(pctldev->dev, + "pin %s already requested by %s; cannot claim for %s\n", + desc->name, desc->mux_owner, owner); + goto out; + } + if (gpio_range) { /* There's no need to support multiple GPIO requests */ - if (desc->gpio_owner) { - dev_err(pctldev->dev, - "pin %s already requested by %s; cannot claim for %s\n", - desc->name, desc->gpio_owner, owner); - goto out; - } - desc->gpio_owner = owner; } else { - if (desc->mux_usecount && strcmp(desc->mux_owner, owner)) { - dev_err(pctldev->dev, - "pin %s already requested by %s; cannot claim for %s\n", - desc->name, desc->mux_owner, owner); - goto out; - } - desc->mux_usecount++; if (desc->mux_usecount > 1) return 0; diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 66e4697..ca6c99c0 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h @@ -132,6 +132,7 @@ struct pinctrl_desc { const struct pinctrl_ops *pctlops; const struct pinmux_ops *pmxops; const struct pinconf_ops *confops; + bool strict; struct module *owner; #ifdef CONFIG_GENERIC_PINCONF unsigned int num_custom_params;