From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1166913AbdDXIfv (ORCPT ); Mon, 24 Apr 2017 04:35:51 -0400 Received: from mail-db5eur01on0092.outbound.protection.outlook.com ([104.47.2.92]:55803 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1166826AbdDXIfW (ORCPT ); Mon, 24 Apr 2017 04:35:22 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=axentia.se; From: Peter Rosin To: , Greg Kroah-Hartman 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 , Philipp Zabel , Subject: [PATCH v14 04/11] mux: gpio: add mux controller driver for gpio based multiplexers Date: Mon, 24 Apr 2017 10:36:28 +0200 Message-ID: <1493022995-16917-5-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1493022995-16917-1-git-send-email-peda@axentia.se> References: <1493022995-16917-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: DB6PR0501CA0040.eurprd05.prod.outlook.com (10.168.78.154) To AM5PR0202MB2548.eurprd02.prod.outlook.com (10.173.89.9) X-MS-Office365-Filtering-Correlation-Id: 51c0015f-d307-4c9e-179b-08d48aecc9ee X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075);SRVR:AM5PR0202MB2548; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2548;3:NpmVupMSxM1BRZxva04oGVBpyc9Eigvi39hZ2LevdplbmIe827mtdxTAg+kfGgyKeFtS9R6HLR8axEI8DAnFb1rD7oSTMLb+nI1RQ6ONpDZZ8HFyjaT+dNPCzy7GRu/q+SP1Lo7qzZ085/mdxIGtlvITvONlyd4kNLb9X6EncgmvZ8C39AUA8VpowvTQ+s+9E6Vintb9j2GqFSxPXGQTj+mzXPFJUrcWmhlfyBlJgF/hzRp9clGzj4dZbbQxZRMtQGpEvzzsXH8FIGY/hqkz1VEfsqA+iZrE45EZIntFpRAelqoSlcZprH5X+/aVc0za;25:efD6YMEJYGC5Yay1BtqFB6x4Z/W15eW5WISLL84XQXl3kGuQqFZol8ew234c72+uwHyId+IHlwPpOO82PRATUu4kkO2/kKNqyeQX8bgwvpjmomcybucydvBKZxnr7ZiFSSoibh1R2z/4xBE0yu8ijncjTjHLnbHR9d34P2zsSqX+dAYu0LoMJR0mROUwGP9+CuMp1o3mF6ccz8zuW8Jwk8Pvy1gYwXpdf4sOev2bJ1chc0HWow+QHssxVlK/x4bYcpYRGzZQx6Uka3VqBPWXt3OGzA0oFKoS381keReu5l5DyhnD6epvks3HVq2of8d9RbakWU/YRsfva51DAcVXsp90CYwuRXvqLcZWRP5zDWbcXkW1gZubIO46nt1cbBUDDr33+tfUC7gEpCl2hHzgeATZemHP/eX8/uytFefslPitYhZAgDulYH5AUXrNCVwFXkZQcNkTftadh25j+VtqyQ== X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2548;31:/rLf8hKkkAyYf210pn31qEzxNZxFprEqPdpKPCLFjpbdHf9MCCjzo9RPmldaO05xS+RjXeE9CZlAXjux2dvx9ktVBxMb2zHLv7fJVpp7SX+XSV8A7R07yZ+wdk3R9gvQ813b4egS6t/59+5XpdwGQYG43/9CwmnqAUWRZDHO8hGBxD97qNmtgXxJMik/0btJh8vym0olxYD2bN+UwjZnqk5Np1Z5QbVQrd6xUNGqjjEdYy+EjeyMkDt2CAjNLPfV X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(10201501046)(6041248)(201703131423075)(201702281528075)(201703061421075)(20161123560025)(2016111802025)(20161123562025)(20161123555025)(20161123564025)(6072148)(6043046);SRVR:AM5PR0202MB2548;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0202MB2548; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2548;4:BUrcxbtClPy/cRnWSBnzirDbF18Gyl6Ebe5JBY10MgrSVYUbh0Y6U6V68QMEQuT7hEGQCyY3hWPHUd/nr6Qyp8eyfOFdMsOyerhW99YiARw+kgMMsVW6EmQeIPXikBpsm69yCTEqX2bU8ti4xYdB/rE5ATocd+Btowd3qFnVxv/z0Jn3yXb3NLL01p47CvWCB7ELYiACYsfSozkOhMNZCFx9ptpYQdh/s7iunsgNG6tqr9dhz5SGF+x4YA0qGJX1Ll6lvyE0d0YW+lv/KznGRjQkDfAy81bK/qkdClb87eAWF8o4GDUU/y3Xsp/3rrX/ZWw654fhIFgTg4Me6FZqX/j7pfaxa0bFETpjUOr6RPZPJb9jxuxdtWyo8BqgqScVezEShDywnZml3LRvZtjEstNhAnErvjlsIsteFAkvDwa7AGlgK0aqOKKRRMerlOVEKwJG/AQTzU4SNFfXc8SLbH7WPOGyCFZJzi0sjB1VaPPbgrC2bNBmu8j703HFQZoDAQBxu76fN+klazrwEmXvmwU+vuf+XiupVVwuMZPBp9NEdnm9fUH67tHS6cZZANct0KxCAI3E3x4qmAt2Zuh2DUUWgv/jeShOyjpA49cHwlHVlbWsRb2Vx6+KLICGNRoL5hz6hoe0vZaAr19jLlYGNsdOiZC5gMP9gXR4fLQZtZaXCLkuV2OdVBGqXfwyQI9VsvRChixWymDtTuNwDxupqnwwWgk/2nTzGwkb95UghTqeIKkW9/UwlHxJBd89cR9MVWnqV5APDpVFvTBWaE22NA== X-Forefront-PRVS: 0287BBA78D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6069001)(39450400003)(39400400002)(39410400002)(6506006)(47776003)(4326008)(189998001)(6486002)(42186005)(8676002)(50226002)(81166006)(50466002)(48376002)(38730400002)(5660300001)(7736002)(86362001)(6666003)(305945005)(76176999)(50986999)(7416002)(2950100002)(54906002)(8666007)(25786009)(66066001)(6512007)(53936002)(36756003)(5003940100001)(2906002)(74482002)(33646002)(3846002)(6116002)(2004002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0202MB2548;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0202MB2548;23:HDXnajwP1j1xMK+TV89K0HZbV/Ph4naaF9Gli/m?= =?us-ascii?Q?13WWRHv1QqI77bK0qabvWzHex10cjziKagCr7HNAW5WwtHhUMRSkdqaY3vne?= =?us-ascii?Q?ZHC4+Y4NgpufBCPYbiXxMYHNCxHRJiB6J5OkmMDUcFLlIk6rh/UzBlwwnzwd?= =?us-ascii?Q?faqCmsCJVMcHudqoRoQRM/wlFBT3naJW8ohY94eOIGdY43xnI0emxS6GYjV4?= =?us-ascii?Q?sk7Ama8+Do6inthdpAFMQvDuiAEnIP1ILtgXnAvmA9Nhc5tD67ZCNjBtDiGz?= =?us-ascii?Q?G75PC5V1rzS5D7jlhJH7N9R1upbD3qxnYMrZduUV7Zu6ukWiqFOoScKSo2LL?= =?us-ascii?Q?bwYdE3C92efCzkZkY33F087KmRn3clTr1TFe3Jbw5ojLZksMBNIJNk82/UbY?= =?us-ascii?Q?cRhDhhYNEPR7mUwT53+LoBxGCoTtB2Lr0wdUzeLmRKQQEaryv38VV7IeOVZa?= =?us-ascii?Q?vThHbw0o8x0StiR+2A4pXg6ZQ/YWae+uDfjNwrLG0f+dOvyc1B73Gkw/ufq1?= =?us-ascii?Q?/qlBRVG2CRixopB/yasYaW3bXaOFDwSnvsaA02I87/02N+7cIqggV+Cm98lz?= =?us-ascii?Q?cSFpFpkYaTNdSD4f7o8zxWzJmsztroyow23PStnRbz4i2ZTHAonsmoj0uuBJ?= =?us-ascii?Q?qYUSJiE3l9vmcdokwkC8DjB+F3Ro6AxkSYEKGmwfpEqjoPpvPjQOQBxNqVOx?= =?us-ascii?Q?UflTS+pm+6r4/74E/1N/RRklDuSkrLSeourybxYZoD8oFVoqfolqsvtUk7EI?= =?us-ascii?Q?uqoaESUT1MVWhw3RYgXD0lJdJIInGgiqaGhCE+gYaAPrhbuZHrHnuU8PBfAX?= =?us-ascii?Q?qvE4dzOmYVkepL7IeqnAE1X8yd04/FUzFjwX7S4UuLr3yOM0sKQkbwKvVufr?= =?us-ascii?Q?ydExAD6y8LGJesUTdIXsqIFz/XV66VMJeqIvm30o4uaY4IqNdAtCR6hHijg+?= =?us-ascii?Q?8ibLU3mHctYxEBHIt8l/Nmtkc3Ksin1jtF8pIVF/BV/b0OSnVDsOywoQ3nFN?= =?us-ascii?Q?bjxbznYUmLgoQazc09JHKM/15Tvw0El/fJoVjuoHrO3/7ZMJLBcgROWMITPL?= =?us-ascii?Q?4wb+XLkM=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2548;6:9NQdKXLGHOp/738bxip1HwUumuFziruKHjqOiFQR51KrijpPnHeHAl/DvBtYV4uOjxvKORErn4Ckr4xj/TVjjtc12aHBqMLBKWLyROEoAt+yspXfgIlCOGSZyu6oLtRdN0GOkt/Pq+N6aiyGxjQvFoiQyDIY1dFS+LyFe2UcqI3oUyDFjTHttIjxh0m2iiw/yt63gErXvyGBtPkxJPr0h+gW1tQQP3EU1+vsf1iGuQFOYmVFXyemdKfC/igHCGzDvZhBCcTUel1FkqJLUzw64AjTqMPFQBsCtA2KsGWEVPgD5UE8T3RvYm1S1QyEV3sG6r1b2qv2Mcu9WjdKsmShEGbRk50u+pkUuEY3zntdhUEX+3hMBNaTEgNXjig0Y4YSEihP1P+dkNLvPZlfqo/h/HOmcScUx2AZOgXAMXHsWP2VMn8XsY0oA/rRaIpX5UEBg4BX9sH0M+wflyU3iRGOq2xlZCp9pTETqzZDCeSeTP+F9YtSjrqZxPwZgp3fRsTMXL8+Gaj4e8Iin8snfYFGtw==;5:cNIxT6jrtMQqZAsWUiHhK9tJDFqNs6CFMYKcBGYfWZZ7VpV0xdzwlh1M1ExR7AqRYbtycf5jR0IqkEjDO33gvARyx70S9EDwC+2Nt2Mm3fAfkSNZWPllaWo7z8A2VxM//3x2l1xMee7xhK4DeKaSnQ==;24:SnCqnufGmCYYJNEA/w/VwklZGbUUgvm3bveoGJuh1bUEGibodN2+0eAADsnf9tAulzprybghrDCrjCIhTRscTReZH6bEWjws2Pz12yyGefM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2548;7:b4CT0IoLuBshP0LeQXhhB+oIYpGNduvZ41q0mId8+hFIPis6y4LhHpWO8vUl1fTfMz20p9QqXzOZh94l6uxQ0Ofs035GfxTqlPsCF1KPjwCt+T+CPZR/H4oiEQ9YZ7QXFyLsOelVJXUm3pqn3B26uD5ww8ipiWuUiUbfE7DPGDSIo9aB8OLuRm5lfQzfWKPr600oyBOENCAxHPZyKYtW26GHcZgGMvykGE31IaBzJQO5E9+r87Qdw0DADhakCEEi3LGH1LheLwj+dSAlB8ETpTiaG/f4mYCKXcxPMHHFM8JGleOlGCYLrVToUhDlWMOQlHNJWFokNMS3qv4zEG/IQg== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2017 08:34:54.6915 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0202MB2548 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The driver builds a single multiplexer controller using a number of gpio pins. For N pins, there will be 2^N possible multiplexer states. The GPIO pins can be connected (by the hardware) to several multiplexers, which in that case will be operated in parallel. Reviewed-by: Jonathan Cameron Signed-off-by: Peter Rosin --- drivers/mux/Kconfig | 18 ++++++++ drivers/mux/Makefile | 1 + drivers/mux/mux-gpio.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 drivers/mux/mux-gpio.c diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig index 23ab2cde83b1..e580c2d028d2 100644 --- a/drivers/mux/Kconfig +++ b/drivers/mux/Kconfig @@ -14,3 +14,21 @@ menuconfig MULTIPLEXER To compile the subsystem as a module, choose M here: the module will be called mux-core. + +if MULTIPLEXER + +config MUX_GPIO + tristate "GPIO-controlled Multiplexer" + depends on GPIOLIB + help + GPIO-controlled Multiplexer controller. + + The driver builds a single multiplexer controller using a number + of gpio pins. For N pins, there will be 2^N possible multiplexer + 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/Makefile b/drivers/mux/Makefile index 09f0299e109d..bb16953f6290 100644 --- a/drivers/mux/Makefile +++ b/drivers/mux/Makefile @@ -3,3 +3,4 @@ # obj-$(CONFIG_MULTIPLEXER) += mux-core.o +obj-$(CONFIG_MUX_GPIO) += mux-gpio.o diff --git a/drivers/mux/mux-gpio.c b/drivers/mux/mux-gpio.c new file mode 100644 index 000000000000..468bf1709606 --- /dev/null +++ b/drivers/mux/mux-gpio.c @@ -0,0 +1,114 @@ +/* + * GPIO-controlled multiplexer driver + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +struct mux_gpio { + struct gpio_descs *gpios; + int *val; +}; + +static int mux_gpio_set(struct mux_control *mux, int state) +{ + struct mux_gpio *mux_gpio = mux_chip_priv(mux->chip); + int i; + + for (i = 0; i < mux_gpio->gpios->ndescs; i++) + mux_gpio->val[i] = (state >> i) & 1; + + gpiod_set_array_value_cansleep(mux_gpio->gpios->ndescs, + mux_gpio->gpios->desc, + mux_gpio->val); + + return 0; +} + +static const struct mux_control_ops mux_gpio_ops = { + .set = mux_gpio_set, +}; + +static const struct of_device_id mux_gpio_dt_ids[] = { + { .compatible = "gpio-mux", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, mux_gpio_dt_ids); + +static int mux_gpio_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct mux_chip *mux_chip; + struct mux_gpio *mux_gpio; + int pins; + s32 idle_state; + int ret; + + pins = gpiod_count(dev, "mux"); + if (pins < 0) + return pins; + + mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio) + + pins * sizeof(*mux_gpio->val)); + if (IS_ERR(mux_chip)) + return PTR_ERR(mux_chip); + + mux_gpio = mux_chip_priv(mux_chip); + mux_gpio->val = (int *)(mux_gpio + 1); + mux_chip->ops = &mux_gpio_ops; + + mux_gpio->gpios = devm_gpiod_get_array(dev, "mux", GPIOD_OUT_LOW); + if (IS_ERR(mux_gpio->gpios)) { + ret = PTR_ERR(mux_gpio->gpios); + if (ret != -EPROBE_DEFER) + dev_err(dev, "failed to get gpios\n"); + return ret; + } + WARN_ON(pins != mux_gpio->gpios->ndescs); + mux_chip->mux->states = 1 << pins; + + ret = device_property_read_u32(dev, "idle-state", (u32 *)&idle_state); + if (ret >= 0 && idle_state != MUX_IDLE_AS_IS) { + if (idle_state < 0 || idle_state >= mux_chip->mux->states) { + dev_err(dev, "invalid idle-state %u\n", idle_state); + return -EINVAL; + } + + mux_chip->mux->idle_state = idle_state; + } + + ret = devm_mux_chip_register(dev, mux_chip); + if (ret < 0) + return ret; + + dev_info(dev, "%u-way mux-controller registered\n", + mux_chip->mux->states); + + return 0; +} + +static struct platform_driver mux_gpio_driver = { + .driver = { + .name = "gpio-mux", + .of_match_table = of_match_ptr(mux_gpio_dt_ids), + }, + .probe = mux_gpio_probe, +}; +module_platform_driver(mux_gpio_driver); + +MODULE_DESCRIPTION("GPIO-controlled multiplexer driver"); +MODULE_AUTHOR("Peter Rosin "); +MODULE_LICENSE("GPL v2"); -- 2.1.4