From patchwork Fri Mar 10 11:09:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Rosin X-Patchwork-Id: 737353 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 3vfl0h2Z13z9s7k for ; Fri, 10 Mar 2017 22:10:12 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=axentiatech.onmicrosoft.com header.i=@axentiatech.onmicrosoft.com header.b="p9Rr2N2y"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934540AbdCJLJt (ORCPT ); Fri, 10 Mar 2017 06:09:49 -0500 Received: from mail-ve1eur01on0130.outbound.protection.outlook.com ([104.47.1.130]:48032 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934422AbdCJLJo (ORCPT ); Fri, 10 Mar 2017 06:09:44 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axentiatech.onmicrosoft.com; s=selector1-axentia-se; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=EMezxtgBB17C/tRZUgqbtorGdoWgcivHkI2/WlqW5gM=; b=p9Rr2N2yTl/OHobQKyOnVZxgKJ+NDD3dbbvs7xFnLtp3pP8yPHhKUTOsUOI3EzHVyZDhjF/DfyKzg2d/CmHXpLo+ly4+0VQFXILsFcB8tnwyAPKPGzGQD/upMNrWTnKkFiPAxkdbqoWySOcAGQneZe2La/rhObCp7guqFa+OG6k= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=axentia.se; Received: from localhost.localdomain (81.224.171.159) by VI1PR0202MB2560.eurprd02.prod.outlook.com (10.173.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.947.12; Fri, 10 Mar 2017 11:09:38 +0000 From: Peter Rosin To: CC: Peter Rosin , Wolfram Sang , Rob Herring , Mark Rutland , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Jonathan Corbet , , , , , Andrew Morton , Colin Ian King , Paul Gortmaker Subject: [PATCH v10 02/11] dt-bindings: document devicetree bindings for mux-controllers and gpio-mux Date: Fri, 10 Mar 2017 12:09:56 +0100 Message-ID: <1489144205-17427-3-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1489144205-17427-1-git-send-email-peda@axentia.se> References: <1489144205-17427-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: HE1PR02CA0050.eurprd02.prod.outlook.com (10.163.170.18) To VI1PR0202MB2560.eurprd02.prod.outlook.com (10.173.79.139) X-MS-Office365-Filtering-Correlation-Id: 0763a4dd-5a81-4eef-8229-08d467a5f2b4 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:VI1PR0202MB2560; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 3:rW7sK1p4EpRM75hdmJ/OLF2B8D1T5PDOPpvHTwkKxsDVUsFMJoySt+GWZUiUiHmyEkVJNeh/QI1y6vt3AQxWTVOI9OpeouhTz4yqFEOYV86nsiVvFwyTp9f8IeqPBrtbtk6Zb4bhv+RHim1ET55voOIbGsUgmZLDH9kOEu+DszIWB75lOnFYIQpNyi1zcozesWatf5ghFbfeO0EH543go1AFpMyAlFmHJ+Ztm3nORyqgV955mQs7Jjrg56g+LaCDhkkzoQqw7b35JIKPvuKcvg==; 25:fJOpRQV2fQV6GMcszATVUU04sRKrtdWjPPb1cOpoZltf4rpFjglO+jaxOOiweWnNTQk3XGFsqqlzGyp/hDslHczaTL6w4hXxXvNL0XLn2wqxq6/yygizse8A+eClGDYgl1mnsa1uvPdMBoKI4eN810b0W862JXGcrFtJqUhUjM0hQhXrMfaRefVCnvhjPZOBnAOBSEPOiUM4i2xnMx83gMniN6fMihmvCkYd59/ECZfN35Z2OJWid/UnGpj6VkObnPyO4Zf+50MDDCcQc464IA90wXXo1oDg7sSYMt3uai9RyAPoDNxqdTsX9O/2sSugyNIwll+DSoC15Z+8c+1QsxppgZuGZiS2t2Mf+IFSTFJzRgCtwQVzojAPK0c5RLxZ+TjJbb/y06pr2ypHGq89YOuFLAqzpdUiHzkfOWchGOeWrgSTupzh6uZai9nulHF92bSBFxakdMGugWwim9I2Vw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 31:tsj1nBntWqtX28uCh0Lor2MCxU6SKDaPU0LmCrsl3h0x46LUmO3CKMDDrXfzznGw0tH60Nzwcoj9OpxjGWnOq7Gd8XrpmlasWY+YgttPTU2gXLG8AD4DBUIfJbq6edKKg0joJ8sZRBcMeKg8eKuM4qxDAgNT/GhcVF46Fw17hu6rOhuXY1bdTWV9wTy2c+LN3lVkgox4Vclev7Bo6YK/V/ME4yB22A1UwiinQmx5V0E= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(11668515415152); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(2016111802025)(20161123560025)(20161123558025)(20161123555025)(20161123564025)(20161123562025)(6043046)(6072148); SRVR:VI1PR0202MB2560; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0202MB2560; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 4:XkDy9/wGRs+TudLLXvIXXFSHjFLU8BX5RuD0VV0+KM7erCmqplW1cLIJ63LcJsDJgYbeLDoJ2TXVKnQ+vm0VujYXMTTCDW0NGCaI+X6uGwAKPMLRI88f9HaiiK/jrC9Vr0zwW8UJjzXTjrDSlPlIZhfo44HxeN8dns/7Tcw1JJV0nP8ggwWYGmEdqd17sex5znZMPpNWX8e4Kv75hl3VpfNsvnKdoPf3sHA+426pMCbC5tW9rByFl9JzOuHOlIpX1orFSzUbVI1rqEavNQKb0BIPwhopyMDRY84IuWVoFDjEKFylzyj+k6xnQKlVn1JM7rKQQzs6pCTWOoZzEmerCZ+aD6EsNUZcmcKV16rkMGLjeuaCzrOkf++1hsuPsbMS6XiBt0KCddRVUW2i1B/0zAMUTe3Bq05aPX0p/FRYIB3twlsnRCDPG9QCL1SgiXYtSZgV7bSx4zAK6b5mHaew+58PiI2TCyGHrU4ukCIgBXNBNfZLn/4rYnYlGWj0hEL0yGA4Ahre7tTP9XYxGXpLy6hUW8HqwzY1T7Y3GzDgHD4txDPVMBPe3moUghjTxwoa7kUBw9AhmTj2TtEcDkVW0Uu/KSs67CDJytT78fBSbbhoNl21M9rLzourme8sMQDbBe+pa5i51Hwk6gudAKIr7BLV6ED2QrWXVnzlSecx8d2qKvGXw/nZdJ5Y9Tb63r50XzU1rrs8WxyTnc7Cb/KCcg== X-Forefront-PRVS: 02426D11FE X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39830400002)(39450400003)(39410400002)(5660300001)(6506006)(8666007)(6486002)(25786008)(42186005)(2351001)(2950100002)(6512007)(2906002)(6666003)(38730400002)(6916009)(7736002)(50466002)(110136004)(54906002)(50226002)(4326008)(86362001)(48376002)(53936002)(66066001)(47776003)(74482002)(81166006)(50986999)(76176999)(5003940100001)(189998001)(305945005)(8676002)(3846002)(36756003)(6116002)(33646002)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0202MB2560; H:localhost.localdomain; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0202MB2560; 23:WNor3J7HbM4CDJKiHcTMlfiIdZgTesnvnnCdFCH?= =?us-ascii?Q?1G6Cmy1hcIeYqF+GvOG8B42lbLd9xeB8OdRtEtrfmr+WKBvNzb8yiDRnDnX7?= =?us-ascii?Q?nzFmroKSxTdNeHXtsf/zSUGWN6mihef9cSDsTpgO9n+BDTUyZHVFJ17VWfgW?= =?us-ascii?Q?TmtqpP237wHgSPgcZjJksesLI4k8ecsz/xPjEVRCoWFdcd145xtL6ldfc39K?= =?us-ascii?Q?2PgRqGeQRcAU4JzCIVWPh1OImQ2BRYRFx2RKosj3YNYtEuKXNwu3/pah/2X0?= =?us-ascii?Q?RtP6VhDc1iFCjUmgypTQPBS9nO/AuDliAokXpRowASCGpOxSgfS7j2xgSi4/?= =?us-ascii?Q?oxq+q98hOmQrr4rBJnzPzB2oDOSeHAsrvEi8cUGOUId+8rRS4NJ4iwjMi31k?= =?us-ascii?Q?UjbwTrg4r9CdSLQMwNVKqSB+ubEJWMPkvhIZ45DvAJ2o91K21MRaLo/xcF3Q?= =?us-ascii?Q?hhxxS3bVowRb7AjHFHcsaPNkKayaAJbulSC6S5DazY4KaBPhjhSDkPL2sUSA?= =?us-ascii?Q?GQkKQJvGUvbJxtesHNdvU7okPW3VshpAdvwvvxn0lluxxgnWY4/B1JngpgwC?= =?us-ascii?Q?5ovqZ3NAl1YdSeflfReQ9ag3LGGQr8jw6xLn7S0vbaziKoZ/m/b5jjmlIA+w?= =?us-ascii?Q?31E33OUS+Vb1wsZir/PCXVJKC19SjQFvR+Pq3o0OR7RjfNUtyqu0BXLsYbDy?= =?us-ascii?Q?zYRsA77ueDKykAKSLiyCZp3yaGEvOQMsFHww2rvne8lXZ9vapLq19KaFt/ib?= =?us-ascii?Q?KIgcXOtvtSTJLT3GXa+u2upob8tb1GSw8HG191m2E2ZozL6wrLHuPjGgTWmH?= =?us-ascii?Q?Ya9DkTGYuTZ0iYlAfnAgTpiFdgsGBd10lg1vEnVXauUnJ9hdHmw4FTS6C0nU?= =?us-ascii?Q?alUBPjnJgLhlyvx/pj3L1PnLlzdLjUJFXSwneReUj77zsOx5miOYjZy5tsRz?= =?us-ascii?Q?k2j/KpfLlUNkDptKL9igZl042/fisipcyKCQW6+85kJZD9KCELCOVD62LsKE?= =?us-ascii?Q?wGQVti9GvQ/oGXOL8C7geyRPod8JjT/49VNG1/w/JY3YNA6ueiRkHNXBlEWC?= =?us-ascii?Q?O7uTAQyE=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 6:iMzNlgpYdXqRne+nI746AWMcMZugVeHCHnr03zSxR/J3M8yqOiwZ/nNXbK9+yEQy164l5Ht0mT/CLoJxYadrorX9dusjqseDnVrykzUPEpc/RIXLnp1UsUsD7lmNUhNryKDAfrjuvFSnrvD2DqpE7qUkTDKPxTMM1wM8EkwPN/mTm4NiKsq8ygvrjMsnNfIoHFiuU4SgFHrP9u3SiJkt/0x12xJAw1b6EyeKGHCusxghCixL2e1pKgBT8Y41dh0yO0NXAMRnnmEnE2B9rxZRzlGcAL5QHslp3hHlDrEi5j6tknq/OWPmVAf+ZnHIczwL2err1ATRiGRl/aTETziPxHu1YWrnlsJlw6ZgP24+C1gukcgmPZC17agx2UM+0inaEMvG+BfMRcm7Z5rqnh1uyw==; 5:tUs9s7NHoUUXlS7z8aDlge28Hxv9JWagRwQH6qOuEiN562MzKC3XrGJQJ0ybkdNe1x2ZQjbdGnMK3wxAJVP1O2axupVdFa7Gvb6BSw+G48ZNQ/c/dWA9a3+LFpY8UxrEhh0iHk34fQF/hEDe9UpzugoAQfhrlYiCJp5x+SXCfGk=; 24:RW/4CQ5cjuEi3Tmh6XWpq1xBcovKkx+K/u9XZz0oqYcWYl5A4Ukz43WH/iYcdzO8lNTW2OKm1LhYHs8bHwz2Zr3YxLZJwDBdz5gI34/pJQI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 7:cq4WSRaGvOxnv8qbLGRZuyKFGaK6q0iw/oYoKPfWshiUFPyVP2e62wsx6ypuNvRGPef2uTiQIayxP3Nyp7Z63ND5spsbl+4YAg8X/eCufVdVXLp8H4ae7AgZwwJRgrwqG8CoP62CA+OioiTjFL0VI5iKBPVKypfJdLcR+PPxS30DIxCHlLMSsPZSiBwXnckefuwJNZZCgfQObTJwtihKejxdG76C7+b8pY1Rs6KL7MFWOuCcT7AnE9yYMT6kotuUU+6zJMArnpA9lNNaVcAz13hOSqBwr1ClyTp1oqzkoIs4LwOQUteAJYh3Hs6FGZlW4tDDVNEAXSgwAq75YSuUlg== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Mar 2017 11:09:38.5107 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0202MB2560 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Allow specifying that a single multiplexer controller can be used to control several parallel multiplexers, thus enabling sharing of the multiplexer controller by different consumers. Add a binding for a first mux controller in the form of a GPIO based mux controller. Acked-by: Jonathan Cameron Acked-by: Rob Herring Signed-off-by: Peter Rosin --- Documentation/devicetree/bindings/mux/gpio-mux.txt | 69 +++++++++ .../devicetree/bindings/mux/mux-controller.txt | 157 +++++++++++++++++++++ MAINTAINERS | 6 + include/dt-bindings/mux/mux.h | 16 +++ 4 files changed, 248 insertions(+) create mode 100644 Documentation/devicetree/bindings/mux/gpio-mux.txt create mode 100644 Documentation/devicetree/bindings/mux/mux-controller.txt create mode 100644 include/dt-bindings/mux/mux.h diff --git a/Documentation/devicetree/bindings/mux/gpio-mux.txt b/Documentation/devicetree/bindings/mux/gpio-mux.txt new file mode 100644 index 000000000000..b8f746344d80 --- /dev/null +++ b/Documentation/devicetree/bindings/mux/gpio-mux.txt @@ -0,0 +1,69 @@ +GPIO-based multiplexer controller bindings + +Define what GPIO pins are used to control a multiplexer. Or several +multiplexers, if the same pins control more than one multiplexer. + +Required properties: +- compatible : "gpio-mux" +- mux-gpios : list of gpios used to control the multiplexer, least + significant bit first. +- #mux-control-cells : <0> +* Standard mux-controller bindings as decribed in mux-controller.txt + +Optional properties: +- idle-state : if present, the state the mux will have when idle. The + special state MUX_IDLE_AS_IS is the default. + +The multiplexer state is defined as the number represented by the +multiplexer GPIO pins, where the first pin is the least significant +bit. An active pin is a binary 1, an inactive pin is a binary 0. + +Example: + + mux: mux-controller { + compatible = "gpio-mux"; + #mux-control-cells = <0>; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>, + <&pioA 1 GPIO_ACTIVE_HIGH>; + }; + + adc-mux { + compatible = "io-channel-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + mux-controls = <&mux>; + + channels = "sync-1", "in", "out", "sync-2"; + }; + + i2c-mux { + compatible = "i2c-mux"; + i2c-parent = <&i2c1>; + + mux-controls = <&mux>; + + #address-cells = <1>; + #size-cells = <0>; + + i2c@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + ssd1307: oled@3c { + /* ... */ + }; + }; + + i2c@3 { + reg = <3>; + #address-cells = <1>; + #size-cells = <0>; + + pca9555: pca9555@20 { + /* ... */ + }; + }; + }; diff --git a/Documentation/devicetree/bindings/mux/mux-controller.txt b/Documentation/devicetree/bindings/mux/mux-controller.txt new file mode 100644 index 000000000000..4f47e4bd2fa0 --- /dev/null +++ b/Documentation/devicetree/bindings/mux/mux-controller.txt @@ -0,0 +1,157 @@ +Common multiplexer controller bindings +====================================== + +A multiplexer (or mux) controller will have one, or several, consumer devices +that uses the mux controller. Thus, a mux controller can possibly control +several parallel multiplexers. Presumably there will be at least one +multiplexer needed by each consumer, but a single mux controller can of course +control several multiplexers for a single consumer. + +A mux controller provides a number of states to its consumers, and the state +space is a simple zero-based enumeration. I.e. 0-1 for a 2-way multiplexer, +0-7 for an 8-way multiplexer, etc. + + +Consumers +--------- + +Mux controller consumers should specify a list of mux controllers that they +want to use with a property containing a 'mux-ctrl-list': + + mux-ctrl-list ::= [mux-ctrl-list] + single-mux-ctrl ::= [mux-ctrl-specifier] + mux-ctrl-phandle : phandle to mux controller node + mux-ctrl-specifier : array of #mux-control-cells specifying the + given mux controller (controller specific) + +Mux controller properties should be named "mux-controls". The exact meaning of +each mux controller property must be documented in the device tree binding for +each consumer. An optional property "mux-control-names" may contain a list of +strings to label each of the mux controllers listed in the "mux-controls" +property. + +Drivers for devices that use more than a single mux controller can use the +"mux-control-names" property to map the name of the requested mux controller +to an index into the list given by the "mux-controls" property. + +mux-ctrl-specifier typically encodes the chip-relative mux controller number. +If the mux controller chip only provides a single mux controller, the +mux-ctrl-specifier can typically be left out. + +Example: + + /* One consumer of a 2-way mux controller (one GPIO-line) */ + mux: mux-controller { + compatible = "gpio-mux"; + #mux-control-cells = <0>; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>; + }; + + adc-mux { + compatible = "io-channel-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + mux-controls = <&mux>; + mux-control-names = "adc"; + + channels = "sync", "in"; + }; + +Note that in the example above, specifying the "mux-control-names" is redundant +because there is only one mux controller in the list. However, if the driver +for the consumer node in fact asks for a named mux controller, that name is of +course still required. + + /* + * Two consumers (one for an ADC line and one for an i2c bus) of + * parallel 4-way multiplexers controlled by the same two GPIO-lines. + */ + mux: mux-controller { + compatible = "gpio-mux"; + #mux-control-cells = <0>; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>, + <&pioA 1 GPIO_ACTIVE_HIGH>; + }; + + adc-mux { + compatible = "io-channel-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + mux-controls = <&mux>; + + channels = "sync-1", "in", "out", "sync-2"; + }; + + i2c-mux { + compatible = "i2c-mux"; + i2c-parent = <&i2c1>; + + mux-controls = <&mux>; + + #address-cells = <1>; + #size-cells = <0>; + + i2c@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + ssd1307: oled@3c { + /* ... */ + }; + }; + + i2c@3 { + reg = <3>; + #address-cells = <1>; + #size-cells = <0>; + + pca9555: pca9555@20 { + /* ... */ + }; + }; + }; + + +Mux controller nodes +-------------------- + +Mux controller nodes must specify the number of cells used for the +specifier using the '#mux-control-cells' property. + +Optionally, mux controller nodes can also specify the state the mux should +have when it is idle. The idle-state property is used for this. If the +idle-state is not present, the mux controller is typically left as is when +it is idle. For multiplexer chips that expose several mux controllers, the +idle-state property is an array with one idle state for each mux controller. + +The special value (-1) may be used to indicate that the mux should be left +as is when it is idle. This is the default, but can still be useful for +mux controller chips with more than one mux controller, particularly when +there is a need to "step past" a mux controller and set some other idle +state for a mux controller with a higher index. + +Some mux controllers have the ability to disconnect the input/output of the +multiplexer. Using this disconnected high-impedance state as the idle state +is indicated with idle state (-2). + +These constants are available in + + #include + +as MUX_IDLE_AS_IS (-1) and MUX_IDLE_DISCONNECT (-2). + +An example mux controller node look like this (the adg972a chip is a triple +4-way multiplexer): + + mux: mux-controller@50 { + compatible = "adi,adg792a"; + reg = <0x50>; + #mux-control-cells = <1>; + + idle-state = ; + }; diff --git a/MAINTAINERS b/MAINTAINERS index c265a5fe4848..7fc06739c8ad 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8558,6 +8558,12 @@ S: Orphan F: drivers/mmc/host/mmc_spi.c F: include/linux/spi/mmc_spi.h +MULTIPLEXER SUBSYSTEM +M: Peter Rosin +S: Maintained +F: Documentation/devicetree/bindings/mux/ +F: include/linux/dt-bindings/mux/ + MULTISOUND SOUND DRIVER M: Andrew Veliath S: Maintained diff --git a/include/dt-bindings/mux/mux.h b/include/dt-bindings/mux/mux.h new file mode 100644 index 000000000000..c8e855c4a609 --- /dev/null +++ b/include/dt-bindings/mux/mux.h @@ -0,0 +1,16 @@ +/* + * This header provides constants for most Multiplexer bindings. + * + * Most Multiplexer bindings specify an idle state. In most cases, the + * the multiplexer can be left as is when idle, and in some cases it can + * disconnect the input/output and leave the multiplexer in a high + * impedance state. + */ + +#ifndef _DT_BINDINGS_MUX_MUX_H +#define _DT_BINDINGS_MUX_MUX_H + +#define MUX_IDLE_AS_IS (-1) +#define MUX_IDLE_DISCONNECT (-2) + +#endif