{"id":2235018,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2235018/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260508-regmap-gpio-sparse-fixed-dir-v2-1-deee84df3027@kernel.org/","project":{"id":42,"url":"http://patchwork.ozlabs.org/api/1.2/projects/42/?format=json","name":"Linux GPIO development","link_name":"linux-gpio","list_id":"linux-gpio.vger.kernel.org","list_email":"linux-gpio@vger.kernel.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260508-regmap-gpio-sparse-fixed-dir-v2-1-deee84df3027@kernel.org>","list_archive_url":null,"date":"2026-05-08T12:51:26","name":"[v2,1/2] gpio: regmap: Support sparsed fixed direction","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"8a616d1675c5066c139212dca97d627526bb915f","submitter":{"id":92050,"url":"http://patchwork.ozlabs.org/api/1.2/people/92050/?format=json","name":"Linus Walleij","email":"linusw@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260508-regmap-gpio-sparse-fixed-dir-v2-1-deee84df3027@kernel.org/mbox/","series":[{"id":503387,"url":"http://patchwork.ozlabs.org/api/1.2/series/503387/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/list/?series=503387","date":"2026-05-08T12:51:25","name":"Improvement spotted during patch review.","version":2,"mbox":"http://patchwork.ozlabs.org/series/503387/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2235018/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2235018/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <linux-gpio+bounces-36462-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=FKUyhf6a;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-36462-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"FKUyhf6a\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gBpxf1hFwz1yCg\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 08 May 2026 22:55:18 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 3022B30AB2FE\n\tfor <incoming@patchwork.ozlabs.org>; Fri,  8 May 2026 12:51:36 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 2473A3E1CFF;\n\tFri,  8 May 2026 12:51:33 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id D9DBD3DFC92;\n\tFri,  8 May 2026 12:51:32 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 09DC9C2BCC7;\n\tFri,  8 May 2026 12:51:30 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1778244692; cv=none;\n b=M1NbGAx+tmf/BI1GflBH5XrL4BOAQ4waHOfU5ljuEVKGz/+qSEwetTsh39IsjYhAFWAgwM9ShGR4Nb2Vz8NO/z5wA38e3APURvUHp9ITi4f+NwUv3kbMDJ8lZNOfl+s6vfwywz+OGCKbF2U6EU5j17CXFEmHKjOWScEO9+0B21o=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1778244692; c=relaxed/simple;\n\tbh=Z4d/UAJ3M/A/sbfOgSOipQRQ0aIMTxR/C/kevDeLGxI=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=bHt5SfuF9pYegBKujLWwTMQrdvrf3WmtA1wZ1WyLuNaWJdpLyE5dRBPmejbS4qy48sgZy1L1Tcj0CYNaSie9AnLSPVh4SUEKoHBQyKlm9DnRmXCYuT34JK2PdUxTk3Ggj7RYcjphomU7wRnj9mIsHLQN9Q/ZAePtFtOGtJgaSZQ=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=FKUyhf6a; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1778244692;\n\tbh=Z4d/UAJ3M/A/sbfOgSOipQRQ0aIMTxR/C/kevDeLGxI=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=FKUyhf6aEYY/o1EdFVCeQCxr6Yi1+RaEskmn0l6hwp5p5pvLn21uINwH60p1B/q7t\n\t 7cUQZuCYXYU2nnC9BZqSxL1NeuAhbmp1uRjXf0MmTCfr30VeQs9TiJawFgF6oY1a/s\n\t UEoyh6zf37dV1Sim8ejtSFqk5zpD0Yh6BhG4FQpmbPL9FgctP9792IY7x0U1H0mxoO\n\t ZwAPEYOrKV3+ZlkAk1Kl+wu5ERk5Cc987ygRlHlg6CDAcg+NqsabcxnaetaHABDuow\n\t nyGINvFDHk+EsHhd+FpcAIUsEk0dZG16JYgch71xRwTMYDumqxZ+jhQLoL7I13UYwU\n\t zGdnmwFNvmZ0w==","From":"Linus Walleij <linusw@kernel.org>","Date":"Fri, 08 May 2026 14:51:26 +0200","Subject":"[PATCH v2 1/2] gpio: regmap: Support sparsed fixed direction","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"\n <20260508-regmap-gpio-sparse-fixed-dir-v2-1-deee84df3027@kernel.org>","References":"\n <20260508-regmap-gpio-sparse-fixed-dir-v2-0-deee84df3027@kernel.org>","In-Reply-To":"\n <20260508-regmap-gpio-sparse-fixed-dir-v2-0-deee84df3027@kernel.org>","To":"Michael Walle <mwalle@kernel.org>,\n Bartosz Golaszewski <brgl@kernel.org>","Cc":"linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,\n Linus Walleij <linusw@kernel.org>, Alex Elder <elder@riscstar.com>","X-Mailer":"b4 0.15.2"},"content":"On some regmapped GPIOs apparently only a sparser selection\nof the lines (not all) are actually fixed direction.\n\nSupport this situation by adding an optional bitmap indicating\nwhich GPIOs are actually fixed direction and which are not.\n\nCc: Alex Elder <elder@riscstar.com>\nLink: https://lore.kernel.org/linux-gpio/20260501155421.3329862-10-elder@riscstar.com/\nTested-by: Alex Elder <elder@riscstar.com>\nSigned-off-by: Linus Walleij <linusw@kernel.org>\n---\n drivers/gpio/gpio-regmap.c  | 37 +++++++++++++++++++++++++++++++++----\n include/linux/gpio/regmap.h |  7 +++++++\n 2 files changed, 40 insertions(+), 4 deletions(-)","diff":"diff --git a/drivers/gpio/gpio-regmap.c b/drivers/gpio/gpio-regmap.c\nindex 9ae4a41a2427..f45a432e8ebe 100644\n--- a/drivers/gpio/gpio-regmap.c\n+++ b/drivers/gpio/gpio-regmap.c\n@@ -31,6 +31,7 @@ struct gpio_regmap {\n \tunsigned int reg_clr_base;\n \tunsigned int reg_dir_in_base;\n \tunsigned int reg_dir_out_base;\n+\tunsigned long *fixed_direction_sparse;\n \tunsigned long *fixed_direction_output;\n \n #ifdef CONFIG_REGMAP_IRQ\n@@ -138,6 +139,20 @@ static int gpio_regmap_set_with_clear(struct gpio_chip *chip,\n \treturn regmap_write(gpio->regmap, reg, mask);\n }\n \n+static bool gpio_regmap_fixed_direction(struct gpio_regmap *gpio,\n+\t\t\t\t\tunsigned int offset)\n+{\n+\tif (!gpio->fixed_direction_output)\n+\t\treturn false;\n+\n+\t/* In this case only some GPIOs are fixed as input/output */\n+\tif (gpio->fixed_direction_sparse &&\n+\t    !test_bit(offset, gpio->fixed_direction_sparse))\n+\t\treturn false;\n+\n+\treturn true;\n+}\n+\n static int gpio_regmap_get_direction(struct gpio_chip *chip,\n \t\t\t\t     unsigned int offset)\n {\n@@ -145,7 +160,7 @@ static int gpio_regmap_get_direction(struct gpio_chip *chip,\n \tunsigned int base, val, reg, mask;\n \tint invert, ret;\n \n-\tif (gpio->fixed_direction_output) {\n+\tif (gpio_regmap_fixed_direction(gpio, offset)) {\n \t\tif (test_bit(offset, gpio->fixed_direction_output))\n \t\t\treturn GPIO_LINE_DIRECTION_OUT;\n \t\telse\n@@ -302,12 +317,23 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config\n \t\t\tgoto err_free_gpio;\n \t}\n \n+\tif (config->fixed_direction_sparse) {\n+\t\tgpio->fixed_direction_sparse = bitmap_alloc(chip->ngpio,\n+\t\t\t\t\t\t\t    GFP_KERNEL);\n+\t\tif (!gpio->fixed_direction_sparse) {\n+\t\t\tret = -ENOMEM;\n+\t\t\tgoto err_free_gpio;\n+\t\t}\n+\t\tbitmap_copy(gpio->fixed_direction_sparse,\n+\t\t\t    config->fixed_direction_sparse, chip->ngpio);\n+\t}\n+\n \tif (config->fixed_direction_output) {\n \t\tgpio->fixed_direction_output = bitmap_alloc(chip->ngpio,\n \t\t\t\t\t\t\t    GFP_KERNEL);\n \t\tif (!gpio->fixed_direction_output) {\n \t\t\tret = -ENOMEM;\n-\t\t\tgoto err_free_gpio;\n+\t\t\tgoto err_free_bitmap_sparse;\n \t\t}\n \t\tbitmap_copy(gpio->fixed_direction_output,\n \t\t\t    config->fixed_direction_output, chip->ngpio);\n@@ -329,7 +355,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config\n \n \tret = gpiochip_add_data(chip, gpio);\n \tif (ret < 0)\n-\t\tgoto err_free_bitmap;\n+\t\tgoto err_free_bitmap_output;\n \n #ifdef CONFIG_REGMAP_IRQ\n \tif (config->regmap_irq_chip) {\n@@ -355,8 +381,10 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config\n \n err_remove_gpiochip:\n \tgpiochip_remove(chip);\n-err_free_bitmap:\n+err_free_bitmap_output:\n \tbitmap_free(gpio->fixed_direction_output);\n+err_free_bitmap_sparse:\n+\tbitmap_free(gpio->fixed_direction_sparse);\n err_free_gpio:\n \tkfree(gpio);\n \treturn ERR_PTR(ret);\n@@ -376,6 +404,7 @@ void gpio_regmap_unregister(struct gpio_regmap *gpio)\n \n \tgpiochip_remove(&gpio->gpio_chip);\n \tbitmap_free(gpio->fixed_direction_output);\n+\tbitmap_free(gpio->fixed_direction_sparse);\n \tkfree(gpio);\n }\n EXPORT_SYMBOL_GPL(gpio_regmap_unregister);\ndiff --git a/include/linux/gpio/regmap.h b/include/linux/gpio/regmap.h\nindex 12d154732ca9..ff00b4aeaf1c 100644\n--- a/include/linux/gpio/regmap.h\n+++ b/include/linux/gpio/regmap.h\n@@ -38,6 +38,12 @@ struct regmap;\n  *\t\t\toffset to a register/bitmask pair. If not\n  *\t\t\tgiven the default gpio_regmap_simple_xlate()\n  *\t\t\tis used.\n+ * @fixed_direction_sparse:\n+ *\t\t\t(Optional) Bitmap representing the GPIO lines that\n+ *\t\t\tmake use of the @fixed_direction_output list to\n+ *\t\t\tenforce direction of the GPIO. If this is NULL\n+ *\t\t\tand @fixed_direction_output is defined, ALL GPIOs\n+ *\t\t\tare assumed to be fixed direction (out or in).\n  * @fixed_direction_output:\n  *\t\t\t(Optional) Bitmap representing the fixed direction of\n  *\t\t\tthe GPIO lines. Useful when there are GPIO lines with a\n@@ -89,6 +95,7 @@ struct gpio_regmap_config {\n \tint reg_stride;\n \tint ngpio_per_reg;\n \tstruct irq_domain *irq_domain;\n+\tunsigned long *fixed_direction_sparse;\n \tunsigned long *fixed_direction_output;\n \n #ifdef CONFIG_REGMAP_IRQ\n","prefixes":["v2","1/2"]}