From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753311AbdARQEN (ORCPT ); Wed, 18 Jan 2017 11:04:13 -0500 Received: from mail-db5eur01on0092.outbound.protection.outlook.com ([104.47.2.92]:7097 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753222AbdARQDv (ORCPT ); Wed, 18 Jan 2017 11:03:51 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; 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 , , , , Subject: [PATCH v8 12/12] mux: support simplified bindings for single-user gpio mux Date: Wed, 18 Jan 2017 16:57:15 +0100 Message-ID: <1484755035-25927-13-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1484755035-25927-1-git-send-email-peda@axentia.se> References: <1484755035-25927-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: HE1PR0801CA0032.eurprd08.prod.outlook.com (10.167.184.42) To VI1PR0202MB2558.eurprd02.prod.outlook.com (10.173.79.137) X-MS-Office365-Filtering-Correlation-Id: 9d0836ca-cf90-4e8c-d23c-08d43fbaeb71 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0202MB2558; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0202MB2558;3:glQYc1U6lcgMeAe9VVjvlKv9BIt7Q6UfhZ2Zh+dMtBEiZY8Q4If99U3T3wbNLkqv9TRARskOSgEWo+RD9bCeM2GWC+0wHSB9EM9GvkJasRR+e9LRJtXOES3X5jWuWk9PkIqX8tqLriusjVKdlnE2Oa1hn93FWMPBshNye8HeqfsZuSjBFSFnlCCebyh/ZYmQbxpewwvz7aLUVhDQA/rxglTHrAi2O3bP9a0h/5+K4oSp5CMxf3FIa4fjWv+KGkgDAlJZbgkt1yTqXiwCMUeePw== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0202MB2558;25:kQaYCG5MScpwGQ0a3gqxPMsdJJANbvHDJ4PPiQxWhruwQPz+Qk8GmaGQLqxzWQR8uUHz6w2x8RXNniOyibSpDacsucyd0LA/C1U+QMz/BW2iIzY5SXXG8qmfPFv13gMcQRIobka97kDcoWp4asBAghXqnPAth10sRI3iC+MOsIN3Raq6mrDKZBQZaqkwDZq7A4ulfPQtwFnWc/+r2aMrcNpuG2aONjd21NyTmJPVsKqnIEgnjvxN48yTSS1qTCC+wbdIDoPwKHhgWCTvNvrrbyz2eSfRKscq1mIicHUmRx7MnBIHHRU0KT0oTaGxPiXfkNeB/YMNqouupeswWaGtHZLeSRBgw9u76LFr3ZbOzMJyk0wt0Dy4XpeV7WSmwBrVyUGXClDSBERAygiz0Bj9Iy6PNDoZjQHOGCidjF6zt9Zk9/D6l5xiytoEWTrsaSixxBvTN02Dr63NrcUulkrfwNyvtPBOY/TsLZMDxNB5AS7pq2F1PaGK2d/M3Ie5ymJx6vIcLGzvMyTFSGxZFmXgd+mp5BONEMPgKGYXNWhMuaZ+3SfbYF8jdboUXhAeRxLl9LOSNWguVT2pxEy2Q5SqCrVM8F+MxtxHQ1IAwrFsdfrEqPx2dLco3SqTfM+HBElXgrxtiO1gZwGsbOKUtqbF/WfcE6kgM2GRZQZh1WAGdAR/m7NhxZXdjUadl4R6XI8hlrw2d5Vwy35c4XMrIRnB3EohPNdefIZkIaTotwvT/vSN8dB9k8U+jMFGmyb6hMOq X-Microsoft-Exchange-Diagnostics: 1;VI1PR0202MB2558;31:s6jjftzBzmaTGJiMQSmqoDm7UbP+HYvSJOUjBqRSFsosdkXMPj2UqNyB5bq5oeBeZlych2vcz+oqol1lnhiMXlqXoURVPzq3F9SNBZx26hNb+lykgRHwa9ucNnMFOe1GzKrKk/uvWh7zAMFbuhJ0KsU+KJwvUte3mKwQnV6qDX1WgZ0vbppkviZR2qeAlRPwLe/xj9t6r8j0PRAnzxNSH0AbA2pmQAKlSTz79EA5BDymmw6xP6pdYJqedxaqo2rY;4:IxBwAM8pKqR9uDUfqiySAH9Eh4fhEj6Ey14FokdAP2Pt5z33EOvnJMrHG3HrVz0mnuLQstvztQVhihoY8mvoQdUy0BdXVS4PwNDMjrp8YeTLbnqVyX6zLdDP2bXGGN1xiM23YblJ31D6SiqpAXkqq4bhrUNPl3SX94CNZMEWWLUoG0Q8xGrjHoYFKHHk+kVNgJWbQmLzTrS/mekybhBR542i6YbUKjTrrO/lEMe+YL5WiuVjsrT+FZ9MAN2ENaQLEzIIdMZoVX7LevkfzVOIyG6puv/QLIdAugiL75Yk5kvxiQ4egdInGN77x2Kh2ftuWpU9Md4gUJuXpneWy99tNXaZq84OAUob/tFHIgiL2KbJUHIaLecRz5ukU650VJYUxyjb4Sb1yqvW/JBoT/oreyafUCaltmO9s3Pl4RYJ3zMNCqcLJ7dGrR0DH0/95CWNx0+qqRSy5j0gZzWDOtOEdmf5rp4MMzLXByoCvqG9jOaMt3CzEq+oF+U8rJ0+GDUCF3TLsi8KNOd4cxZO2neE8J1Omqf5Y16jcWziLoiL+UlGTG3AAZEXeOByUlWUlBDJVoZGGVWPjIEQxEot+D7pIxV8zRPHGrSxYIPhwGHI08YIJ8KNAAf4hIA3+QNQBBle X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(2016111802025)(20161123555025)(20161123564025)(20161123562025)(20161123560025)(6072148)(6043046);SRVR:VI1PR0202MB2558;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0202MB2558; X-Forefront-PRVS: 01917B1794 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6069001)(7916002)(39450400003)(39410400002)(39840400002)(189002)(199003)(3846002)(38730400001)(6512007)(5660300001)(50466002)(101416001)(47776003)(48376002)(54906002)(97736004)(76176999)(53936002)(189998001)(50986999)(305945005)(7416002)(4326007)(74482002)(106356001)(2950100002)(6666003)(86362001)(6116002)(81166006)(6916009)(68736007)(5003940100001)(36756003)(7736002)(2906002)(25786008)(8666007)(42186005)(2351001)(81156014)(33646002)(6486002)(110136003)(6506006)(66066001)(92566002)(105586002)(50226002)(8676002)(2004002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0202MB2558;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR0202MB2558;23:fBVHKfLGiEUwOcDdixGdn6Mxi+4XraS+pPCg4PZ?= =?us-ascii?Q?2FX5fJt5z0CoCYBLJ9tRdSN+d9ttB/R7TKSAzbGVAeTgZl+00OFZW9K6qjtd?= =?us-ascii?Q?EgejeicdEcbLCsnA4ooarj6UK2mwiPC09qTeImc751xSr4zR9iIppGIJAGU6?= =?us-ascii?Q?LyRaRlec/T8oyzEFXcNB/3o93sMze2aEfl+Yq77yhxpWbprvNKCLT+/vesY8?= =?us-ascii?Q?2HZ1dF6fFNTPfJUkVIG4Dy7gdSAXZMPz/vVn+dEBxssTJkrIeGOx+pqm+3hW?= =?us-ascii?Q?zJq+wG0dFD9X8vA4Gb+Zs/889VoHxTaDeMXlZwgq2f0MFSNdekPVzD3f9FmI?= =?us-ascii?Q?lkp7LV5X9VgScNB02cMlblf/wDTrelj6y65FjlER3WL0HiQNumL/jmSJ4Dg4?= =?us-ascii?Q?pV8ASYPWG0s1LlCrQj08pScUZMDmEJ9CySPvf8v36y7uAtIljgAF2RJ6E1Ie?= =?us-ascii?Q?NWibIu4OptVclgDdIOwbFC9qgiS1xEgOzeBswo+Lfd8JKYAAc9IS563sgvmU?= =?us-ascii?Q?Xr41gdwMq3puQirBKzM3/CdmyVBMTc39+6rXMW7hq+bJ9NQg3sf7gU7maqAt?= =?us-ascii?Q?7+OgUV82sopA6FhGPzd2DupWJ4dmvsuYyqEptOcASGAs71OjbNRMjfKia/Hv?= =?us-ascii?Q?0iFN1GHgSvUcUSlM9L3KNJ3c2RPmkI7CNY/oY3/dmQ+cBjXaO3kz+EUYDgOq?= =?us-ascii?Q?Cs72lSN6FxBuj3/ElctBrHc9hvO3A5vuRtoPnY9/+YMLXs6EomsGPmG5Q+D5?= =?us-ascii?Q?Azco5V3/tNeiHX200+atAHwUiuNuoNeKdsbKAXVox3Uj4HxyrAVn+0K/9fYb?= =?us-ascii?Q?OC1Px64WsvKYlmKWyByWgXw6mKZuBU6KHAhgyOXadFyRcpCDa+0u+2Wichfn?= =?us-ascii?Q?eH4hCAnV9X6Sa5aSXwhpJ9Pl/EFsHgs4QnkgteHi9aKScOkQ1uV1N8mzhjJd?= =?us-ascii?Q?AGKGYgKLKYi2C/MdY53rDo/2BDUyEQ22bnwYU61pqZs3owDzB4tBUDbrUYy9?= =?us-ascii?Q?32oieMxzi/9lDgYxSeCTJlzHppFS00WIYZ4t/6SbTLX0znFIf46xCqA9XASo?= =?us-ascii?Q?YrjNUalbdR/JWV+kbDr5RNJKTSP9TJl75GW7uH2oyCr10GdiQva3DT6h1RRM?= =?us-ascii?Q?4NNhl91O2V/63jWRdL1cktzlIEqYeD+KKTp6vpZOCh/RmoD1GVU8VjC6elyI?= =?us-ascii?Q?cbtIlrNsO3JeFq/52Uu2supi9nEq3jojUN6hHkGYho0ih8I9RZ7I/IhqUvFe?= =?us-ascii?Q?KLqJwhF+G+z4BepJ0gj9JWqoiBZhBHkTR5rTAoLPDCfQkASWAMM/ycH3rRPP?= =?us-ascii?Q?TKZtHeXgOSpBHVna4MtTQRSA=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0202MB2558;6:nDy5McwVxrmoL48shzbQPs1yKk8mwVJVqbpjaroBBtEkFIlxpHot1q+ME4HfAlPTcheWONJPgQGdZVWNMGeU3xst4iL9GRmbP/glNBk3i7KFPvoo++R/ZSkmOdSkD0jN4E4ImNubnR7sim+ZAqdI6Npvnxf0NcahE279x+iQGZy9qLEFxviTOk9Drui3+PRFTopTOHzNlaB2QhS/OfxglbBVnRjRI4v9hMyQTrofVuA9sSsdsSffrFov/EmCwi3nz45K3KhtYBTgudJOttxsCueyOLnexCQShfAEfHl8lqcwltDBQ8ul6VA1BM4qJ0MQv/LtnMQ5oZhJgnO6fVfuQOLnZg5J4HeGAT07bkmq/cS7D/SdPbhFa25zfUw+jEPbIrsJNUaaIyquN52XMbLdzpJihT18tTDdfy1VAEagFh4Ks/lpTSE6En6m8cTSNLJ+;5:8O536YtT8XWyA7gzMr56bq6lSVqhzZ+bqEuhU2IPCFcV43uNB36S/aW+F7UqY7P6yIgRVuXwBq5mEyTOKwjI2bdVAupvEsbjoQ3DrWMMUIiwpBpUsfOhpwfhrXq2sG46DXTXjm8c2dtMyf9xH0rg/A==;24:nnJuUtkVAuFGGMsWP5gOlgAVIYlCeP3ETldc7t33Ir6cPT2qTcksc40p67pcSKeTIdxhvzYxYaRWtNqBC1Cqc9sNPt8BX8aIk92uvFALGpc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0202MB2558;7:2xAOuMoa5/A/KNCdmN8O01jRJVxm/Tq3mU59rhZ7rwRmXR7LjzDFKEB7yYShboTR3sSET1+MCKIDsJIwIThTq3tedqtF80t7KW1WYMFiWIs2m++Kv3A2KZjU3SmYxvVwKhqk9SasqSGCo4l0UZdbQGvcgyxwUms5kmlVHcOaj052guQNZOsEsqTdQPp742p3M/veRyLGMf3SmlHExm8aQDXN7HLQNcCveyLCCnvlR8lSVAdEZ+gYVnaUSN9W7zOwCcWzgr7jLCkeI3Zq+a8vqU6LongCGdu2HauXiPtP+jQmAy/aPIDb5Rn7hNWdi54uuJv/YHYpHEZyrSx633qnAo8tX/4YsIBOsXZNmAS+mNN1hLtZj7r5gtSMQNew6zXn3jkrGzaSOj6vT9AkIiu7EaJKBjezR4IXiGVsT7ESapBEv87EwUkYizPRHsKsOF++U0dJdRDrxTXmYZ1Qa6KZPw== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 15:58:58.8144 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0202MB2558 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Allow bindings for a GPIO controlled mux to be specified in the mux consumer node. Signed-off-by: Peter Rosin --- drivers/mux/Kconfig | 5 +---- drivers/mux/mux-core.c | 23 +++++++++++++++++++++-- drivers/mux/mux-gpio.c | 28 +++++++++++++++++++++------- drivers/mux/mux-gpio.h | 13 +++++++++++++ 4 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 drivers/mux/mux-gpio.h diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig index d13fcf98958e..cd161c228537 100644 --- a/drivers/mux/Kconfig +++ b/drivers/mux/Kconfig @@ -29,7 +29,7 @@ config MUX_ADG792A be called mux-adg792a. config MUX_GPIO - tristate "GPIO-controlled Multiplexer" + bool "GPIO-controlled Multiplexer" depends on OF && GPIOLIB help GPIO-controlled Multiplexer controller. @@ -39,7 +39,4 @@ config MUX_GPIO states. The GPIO pins can be connected (by the hardware) to several multiplexers, which in that case will be operated in parallel. - To compile the driver as a module, choose M here: the module will - be called mux-gpio. - endif diff --git a/drivers/mux/mux-core.c b/drivers/mux/mux-core.c index 16a61253d164..0caafd6f5a77 100644 --- a/drivers/mux/mux-core.c +++ b/drivers/mux/mux-core.c @@ -21,6 +21,8 @@ #include #include +#include "mux-gpio.h" + static struct class mux_class = { .name = "mux", .owner = THIS_MODULE, @@ -314,9 +316,26 @@ struct mux_control *mux_control_get(struct device *dev, const char *mux_name) ret = of_parse_phandle_with_args(np, "mux-controls", "#mux-control-cells", index, &args); + +#ifdef CONFIG_MUX_GPIO + if (ret == -ENOENT && !mux_name) { + mux_chip = mux_gpio_alloc(dev); + if (!IS_ERR(mux_chip)) { + ret = devm_mux_chip_register(dev, mux_chip); + if (ret < 0) + return ERR_PTR(ret); + get_device(&mux_chip->dev); + return mux_chip->mux; + } + + ret = PTR_ERR(mux_chip); + } +#endif + if (ret) { - dev_err(dev, "%s: failed to get mux-control %s(%i)\n", - np->full_name, mux_name ?: "", index); + if (ret != -EPROBE_DEFER) + dev_err(dev, "%s: failed to get mux-control %s(%i)\n", + np->full_name, mux_name ?: "", index); return ERR_PTR(ret); } diff --git a/drivers/mux/mux-gpio.c b/drivers/mux/mux-gpio.c index 48ca4d6b4fc7..2ab8735e3415 100644 --- a/drivers/mux/mux-gpio.c +++ b/drivers/mux/mux-gpio.c @@ -18,6 +18,8 @@ #include #include +#include "mux-gpio.h" + struct mux_gpio { struct gpio_descs *gpios; int *val; @@ -48,24 +50,21 @@ static const struct of_device_id mux_gpio_dt_ids[] = { }; MODULE_DEVICE_TABLE(of, mux_gpio_dt_ids); -static int mux_gpio_probe(struct platform_device *pdev) +struct mux_chip *mux_gpio_alloc(struct device *dev) { - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; struct mux_chip *mux_chip; struct mux_gpio *mux_gpio; int pins; - u32 idle_state; int ret; pins = gpiod_count(dev, "mux"); if (pins < 0) - return pins; + return ERR_PTR(pins); mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio) + pins * sizeof(*mux_gpio->val)); if (!mux_chip) - return -ENOMEM; + return ERR_PTR(-ENOMEM); mux_gpio = mux_chip_priv(mux_chip); mux_gpio->val = (int *)(mux_gpio + 1); @@ -76,11 +75,26 @@ static int mux_gpio_probe(struct platform_device *pdev) ret = PTR_ERR(mux_gpio->gpios); if (ret != -EPROBE_DEFER) dev_err(dev, "failed to get gpios\n"); - return ret; + return ERR_PTR(ret); } WARN_ON(pins != mux_gpio->gpios->ndescs); mux_chip->mux->states = 1 << pins; + return mux_chip; +} +EXPORT_SYMBOL_GPL(mux_gpio_alloc); + +static int mux_gpio_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct mux_chip *mux_chip; + u32 idle_state; + int ret; + + mux_chip = mux_gpio_alloc(dev); + if (IS_ERR(mux_chip)) + return PTR_ERR(mux_chip); + ret = device_property_read_u32(dev, "idle-state", &idle_state); if (ret >= 0) { if (idle_state >= mux_chip->mux->states) { diff --git a/drivers/mux/mux-gpio.h b/drivers/mux/mux-gpio.h new file mode 100644 index 000000000000..fe3e8d0173aa --- /dev/null +++ b/drivers/mux/mux-gpio.h @@ -0,0 +1,13 @@ +/* + * GPIO-controlled multiplexer driver interface + * + * Copyright (C) 2017 Axentia Technologies AB + * + * Author: Peter Rosin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +struct mux_chip *mux_gpio_alloc(struct device *dev); -- 2.1.4