From patchwork Tue Sep 27 00:26:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Agner X-Patchwork-Id: 675349 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 3sjhVZ0RP1z9s4n for ; Tue, 27 Sep 2016 10:27:17 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=agner.ch header.i=@agner.ch header.b=NS4YoDNl; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753918AbcI0A1P (ORCPT ); Mon, 26 Sep 2016 20:27:15 -0400 Received: from mail.kmu-office.ch ([178.209.48.109]:39838 "EHLO mail.kmu-office.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750741AbcI0A1O (ORCPT ); Mon, 26 Sep 2016 20:27:14 -0400 Received: from trochilidae.toradex.int (75-146-58-181-Washington.hfc.comcastbusiness.net [75.146.58.181]) by mail.kmu-office.ch (Postfix) with ESMTPSA id A272B5C0458; Tue, 27 Sep 2016 02:21:28 +0200 (CEST) From: Stefan Agner To: linus.walleij@linaro.org Cc: shawnguo@kernel.org, vladimir_zapolskiy@mentor.com, aalonso@freescale.com, b38343@freescale.com, ldewangan@nvidia.com, van.freenix@gmail.com, p.zabel@pengutronix.de, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Stefan Agner Subject: [PATCH] pinctrl: freescale: avoid overwriting pin config when freeing GPIO Date: Mon, 26 Sep 2016 17:26:50 -0700 Message-Id: <20160927002650.4316-1-stefan@agner.ch> X-Mailer: git-send-email 2.10.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=agner.ch; s=dkim; t=1474935690; bh=4sTjcXEPcei+Ub1FweUigX46TdjrfcuzWbycXlbrhR4=; h=From:To:Cc:Subject:Date:Message-Id; b=NS4YoDNlRS9RHCv0U0jCT5ClasKOPookyTfaucDsLNDYwcX448etfEeSj+2l1YzyV733ogsNQbyrABu+LPxU/HcR17KsKs9p23f+IgnLuOlBBNDs1/BMlYjXyvwNqU9f6CxHCOxICA3Gdeh5h1zZWFSN99XcFqD+fBDDf2kT7i0= Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org If a GPIO gets freed after selecting a new pinctrl configuration the driver should not change pinctrl anymore. Otherwise this will likely lead to a unusable pin configuration for the newly selected pinctrl. Signed-off-by: Stefan Agner --- This turned out to be problematic when using the I2C GPIO bus recovery functionality. After muxing back to I2C, the GPIO is being freed, which cased I2C to stop working completely. -- Stefan drivers/pinctrl/freescale/pinctrl-imx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index 4761320..61cfa95 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -361,8 +361,13 @@ static void imx_pmx_gpio_disable_free(struct pinctrl_dev *pctldev, if (pin_reg->mux_reg == -1) return; - /* Clear IBE/OBE/PUE to disable the pin (Hi-Z) */ reg = readl(ipctl->base + pin_reg->mux_reg); + + /* Only change pad configuration if pad is still a GPIO */ + if (reg & (0x7 << 20)) + return; + + /* Clear IBE/OBE/PUE to disable the pin (Hi-Z) */ reg &= ~0x7; writel(reg, ipctl->base + pin_reg->mux_reg); }