From patchwork Wed Oct 30 12:04:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Ujfalusi X-Patchwork-Id: 178098 Delivered-To: patch@linaro.org Received: by 2002:a92:409a:0:0:0:0:0 with SMTP id d26csp1175448ill; Wed, 30 Oct 2019 05:03:44 -0700 (PDT) X-Google-Smtp-Source: APXvYqzPZFJVPcvme0mSzWrGptVFvRlpF/wLx+Y1kqiD6IR3HZXZEJLHAI7tivQUya349u7VNbyu X-Received: by 2002:a17:906:95c2:: with SMTP id n2mr2114252ejy.21.1572437024484; Wed, 30 Oct 2019 05:03:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572437024; cv=none; d=google.com; s=arc-20160816; b=ldjMIf8BA+thqRhuyLf7bK5en+YYE3bTYHg02Qa/+WgbZ20EYdQvZxaDRvu5PEIUKo gtIHot1D7bo5A7Ojh0Ktwck3S4jnMBO0gKPBLdZZPQRwKC1G+0e0iQ9CAhl3f6mH0pDk jrnJg/OxZkJmLDF6gY6nh36kzw65r28/9aIX/p8BFl69hZi7zQutuiCdh6xUGst9YrNT j/9vvQvI/JR3r8RkgjQayq8WkvgoemVWobm9n7z5eys9dT23KkGrtVVuJVreeYlPppav yTMfWvKNpz2Vjudf/ZrRbK7pJ7FGnoVzgKQ0edzcRZQjEBrWJ5+kmCSvd3IhCjvaRdFy eEvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=nlVr6Zj9+j0vCKO0OY9fSOQFWnGg/l/NYJihfhV2J2g=; b=eymfwcPgagOLN/Z+ybW3IVtcNy6X03PqAwunW7llYwnlyUAd7c0nEV4hxmpC7LnhRO BSruJiS+DXj8ixJAeyE9U/jL/C5UqKHctud7fF4R97yqZlfCPipUDh54pacbL9cFQLfD aPOBd9i+Qt8yn5SoqCPyvzrCBwouqV2VdI52L2iopFHYuMtRIXzOfKFtqmLlM7oYdyL2 DxdTADYRiHweRAFGX2QtDxLXQh+sglMDrfICWL85/1ekV9oEzSGmVlVpW+ANvwPO/r70 eXO//CWdYLTuVrbM3pE7sKmLMrkXgzt82/14BLRzzWM11d4YRYP771dsqcZ5a70jvP2I qxzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=czXZNueu; spf=pass (google.com: best guess record for domain of linux-gpio-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-gpio-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i30si1361860edd.124.2019.10.30.05.03.44; Wed, 30 Oct 2019 05:03:44 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-gpio-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=czXZNueu; spf=pass (google.com: best guess record for domain of linux-gpio-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-gpio-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726150AbfJ3MDn (ORCPT + 5 others); Wed, 30 Oct 2019 08:03:43 -0400 Received: from lelv0143.ext.ti.com ([198.47.23.248]:47074 "EHLO lelv0143.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726088AbfJ3MDn (ORCPT ); Wed, 30 Oct 2019 08:03:43 -0400 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id x9UC3ZI9081995; Wed, 30 Oct 2019 07:03:35 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1572437015; bh=nlVr6Zj9+j0vCKO0OY9fSOQFWnGg/l/NYJihfhV2J2g=; h=From:To:CC:Subject:Date; b=czXZNueuXz0hu+ukJJ3s59Y6nziIkMwbytxCB0/mbK5Qg2hg6/WdNSkD1UkLUNzIt MvQzdqEy2Oc5HwwbhfM6Od6d8RftPVQY/khzDumHlaNouMMrktPz+31Soe+0V662DA 3cyfL4SA4NxQueXjqzSdIomQCfIHkZE9+bQXsvKI= Received: from DFLE103.ent.ti.com (dfle103.ent.ti.com [10.64.6.24]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x9UC3Z9e106564 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 30 Oct 2019 07:03:35 -0500 Received: from DFLE115.ent.ti.com (10.64.6.36) by DFLE103.ent.ti.com (10.64.6.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Wed, 30 Oct 2019 07:03:35 -0500 Received: from fllv0040.itg.ti.com (10.64.41.20) by DFLE115.ent.ti.com (10.64.6.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5 via Frontend Transport; Wed, 30 Oct 2019 07:03:22 -0500 Received: from feketebors.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id x9UC3WRH040060; Wed, 30 Oct 2019 07:03:32 -0500 From: Peter Ujfalusi To: , , CC: , , , , , , , Subject: [RFC v2 0/2] gpio: Support for shared GPIO lines on boards Date: Wed, 30 Oct 2019 14:04:38 +0200 Message-ID: <20191030120440.3699-1-peter.ujfalusi@ti.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Hi, The shared GPIO line for external components tends to be a common issue and there is no 'clean' way of handling it. I'm aware of the GPIOD_FLAGS_BIT_NONEXCLUSIVE flag, which must be provided when a driver tries to request a GPIO which is already in use. However the driver must know that the component is going to be used in such a way, which can be said to any external components with GPIO line, so in theory all drivers must set this flag when requesting the GPIO... But with the GPIOD_FLAGS_BIT_NONEXCLUSIVE all clients have full control of the GPIO line. For example any device using the same GPIO as reset/enable line can reset/enable other devices, which is not something the other device might like or can handle. For example a device needs to be configured after it is enabled, but some other driver would reset it while handling the same GPIO -> the device is not operational anymmore as it lost it's configuration. With the gpio-shared gpiochip we can overcome this by giving the gpio-shared the role of making sure that the GPIO line only changes state when it will not disturb any of the clients sharing the same GPIO line. The 'sticky' state of the line depends on the board design, which can be communicated with the hold-active-state property: GPIO_ACTIVE_HIGH: the line must be high as long as any of the clients want it to be high GPIO_ACTIVE_LOW: the line must be low as long as any of the clients want it to be low In board DTS files it is just adding the node to descibe the shared GPIO line and point the users of this line to the shared-gpio node instead of the real GPIO. Something like this: codec_reset: gpio-shared0 { compatible = "gpio-shared"; gpio-controller; #gpio-cells = <2>; root-gpios = <&audio_exp 0 GPIO_ACTIVE_HIGH>; branch-count = <2>; hold-active-state = ; }; &main_i2c3 { audio_exp: gpio@21 { compatible = "ti,tca6416"; reg = <0x21>; gpio-controller; #gpio-cells = <2>; }; pcm3168a_a: audio-codec@47 { compatible = "ti,pcm3168a"; reg = <0x47>; #sound-dai-cells = <1>; rst-gpios = <&codec_reset 0 GPIO_ACTIVE_HIGH>; ... }; pcm3168a_b: audio-codec@46 { compatible = "ti,pcm3168a"; reg = <0x46>; #sound-dai-cells = <1>; rst-gpios = <&codec_reset 1 GPIO_ACTIVE_HIGH>; ... }; }; If any of the codec requests the GPIO to be high, the line will go up and will only going to be low when both of them set's their shared line to low. Note: other option would be to have something similar to gpio-hog (gpio-shared) support in the core itself, but then all of the logic and state handling for the users of the shared line needs to be moved there. Simply counting the low and high requests would not work as the GPIO framework by design does not refcounts the state, iow gpio_set(0) three times and gpio_set(1) would set the line high. I have also looked at the reset framework, but again it can not be applied in a generic way for GPIOs shared for other purposes and all existing drivers must be converted to use the reset framework (and adding a linux only warpper on top of reset GPIOs). Regards, Peter --- Peter Ujfalusi (2): dt-bindings: gpio: Add binding document for shared GPIO gpio: Add new driver for handling 'shared' gpio lines on boards .../devicetree/bindings/gpio/gpio-shared.yaml | 100 ++++++++ drivers/gpio/Kconfig | 6 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio-shared.c | 229 ++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100644 Documentation/devicetree/bindings/gpio/gpio-shared.yaml create mode 100644 drivers/gpio/gpio-shared.c -- Peter Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki