{"id":2175114,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175114/?format=json","project":{"id":42,"url":"http://patchwork.ozlabs.org/api/1.0/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":""},"msgid":"<20251217-staging-ad4062-v4-9-7890a2951a8f@analog.com>","date":"2025-12-17T12:13:32","name":"[v4,9/9] iio: adc: ad4062: Add GPIO Controller support","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"2ea21e11ca6d8e5fb1e8631ea26d9c841c087fd5","submitter":{"id":90425,"url":"http://patchwork.ozlabs.org/api/1.0/people/90425/?format=json","name":"Jorge Marques","email":"jorge.marques@analog.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20251217-staging-ad4062-v4-9-7890a2951a8f@analog.com/mbox/","series":[{"id":485673,"url":"http://patchwork.ozlabs.org/api/1.0/series/485673/?format=json","date":"2025-12-17T12:13:23","name":"Add support for AD4062 device family","version":4,"mbox":"http://patchwork.ozlabs.org/series/485673/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175114/checks/","tags":{},"headers":{"Return-Path":"\n <linux-gpio+bounces-29690-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=analog.com header.i=@analog.com header.a=rsa-sha256\n header.s=DKIM header.b=sgeD5y49;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c09:e001:a7::12fc:5321; helo=sto.lore.kernel.org;\n envelope-from=linux-gpio+bounces-29690-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com\n header.b=\"sgeD5y49\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=148.163.135.77","smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=analog.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=analog.com"],"Received":["from sto.lore.kernel.org (sto.lore.kernel.org\n [IPv6:2600:3c09:e001:a7::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dWXnM0vYRz1y0P\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 17 Dec 2025 23:15:35 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sto.lore.kernel.org (Postfix) with ESMTP id F2A723027706\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 17 Dec 2025 12:15:05 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 2EEB7345CD3;\n\tWed, 17 Dec 2025 12:14:27 +0000 (UTC)","from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com\n [148.163.135.77])\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 DF7593446C0;\n\tWed, 17 Dec 2025 12:14:24 +0000 (UTC)","from pps.filterd (m0167089.ppops.net [127.0.0.1])\n\tby mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 5BHC7Tx23978997;\n\tWed, 17 Dec 2025 07:14:07 -0500","from nwd2mta4.analog.com ([137.71.173.58])\n\tby mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4b3bbevk6u-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tWed, 17 Dec 2025 07:14:07 -0500 (EST)","from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5])\n\tby nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 5BHCE6FF041126\n\t(version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256\n verify=FAIL);\n\tWed, 17 Dec 2025 07:14:06 -0500","from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX8.ad.analog.com\n (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 17 Dec\n 2025 07:14:06 -0500","from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com\n (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend\n Transport; Wed, 17 Dec 2025 07:14:06 -0500","from HYB-DlYm71t3hSl.ad.analog.com (HYB-DlYm71t3hSl.ad.analog.com\n [10.44.3.73])\n\tby zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 5BHCDUvF014815;\n\tWed, 17 Dec 2025 07:13:57 -0500"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1765973666; cv=none;\n b=FjnFOLA++RpjMDDOPcmht0Yyx3mLhgI5C7COG9Rl0PJlRhhKBxeBYDO7wUjiqWX5y5I6jItc75coo4bl+xBkdib0Uh5K0xT1EHK/1ZmgzDKfn6z7I+/afLmLLK2cdLzUkCKbCLlGzv+557641iVe2BHHtDhp7LPBGjMRITERrq4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1765973666; c=relaxed/simple;\n\tbh=rWhz1qhXX5cZm+GWRaQ9ciBLBk8IoCqoYZlI/GtAfiU=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References:\n\t In-Reply-To:To:CC;\n b=lljBBkP4ko5LLJL/1Q+9XdeixaOgSh4vBSG4LQWsrrHVGazAhFDBILgB16X9HhwGJeVHcqcsdujaK8wtpDmu7uEDAjyFXxvcBO/04co3pnDQ0ZtJzlYMq+yGAaoEp7e/SFAez0WLzWGvBKzAeUmGe1XUtKjnwRxw2m4xlytmN4I=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=analog.com;\n spf=pass smtp.mailfrom=analog.com;\n dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com\n header.b=sgeD5y49; arc=none smtp.client-ip=148.163.135.77","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc\n\t:content-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=DKIM; bh=KHwHt\n\tqQuusmzdK7NM7ocl1bh8RRVDH4lMJb8lzPokRI=; b=sgeD5y490ivnBlHVayFX6\n\tNxU5z7mRE39VNGYf1AVEE2q2y7ZHQTQrBy+usEJTmkyy+iLiM12J4NKNU/0a0dbk\n\tOlLUDHDMnKkjg1gUYNWGLcFzXbWyurXUHNNZrNutRnJPiH7JxWIwYb176seDP2x6\n\tw4DOPBhVWHwUWfVEfMIHeZgR/CInXW9vUatvb4u8XSJePFY2TGEiyrvJltGr5MXI\n\tGAEcmi2hkuy3R/AR9l86+lZN02pLwtj7ZONlANTGATNNN7wCK/YF+dHduQWnozKq\n\tWQX9d2FLLgxS2p7yK5KORlQoKcXs0lLvSyPZlN6f/U8pBGaYVrft2iEAuBuDAWES\n\tQ==","From":"Jorge Marques <jorge.marques@analog.com>","Date":"Wed, 17 Dec 2025 13:13:32 +0100","Subject":"[PATCH v4 9/9] iio: adc: ad4062: Add GPIO Controller support","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":"<20251217-staging-ad4062-v4-9-7890a2951a8f@analog.com>","References":"<20251217-staging-ad4062-v4-0-7890a2951a8f@analog.com>","In-Reply-To":"<20251217-staging-ad4062-v4-0-7890a2951a8f@analog.com>","To":"Lars-Peter Clausen <lars@metafoo.de>,\n Michael Hennerich <Michael.Hennerich@analog.com>,\n Jonathan Cameron <jic23@kernel.org>, David Lechner <dlechner@baylibre.com>,\n\t=?utf-8?q?Nuno_S=C3=A1?= <nuno.sa@analog.com>,\n Andy Shevchenko <andy@kernel.org>, Rob Herring <robh@kernel.org>,\n Krzysztof Kozlowski <krzk+dt@kernel.org>, Conor Dooley <conor+dt@kernel.org>,\n Jonathan Corbet <corbet@lwn.net>, Linus Walleij <linus.walleij@linaro.org>,\n Bartosz Golaszewski <brgl@bgdev.pl>","CC":"<linux-iio@vger.kernel.org>, <devicetree@vger.kernel.org>,\n        <linux-kernel@vger.kernel.org>, <linux-doc@vger.kernel.org>,\n        <linux-gpio@vger.kernel.org>,\n Jorge Marques <jorge.marques@analog.com>,\n        Linus\n Walleij <linusw@kernel.org>","X-Mailer":"b4 0.14.3","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1765973610; l=5630;\n i=jorge.marques@analog.com; s=20250303; h=from:subject:message-id;\n bh=rWhz1qhXX5cZm+GWRaQ9ciBLBk8IoCqoYZlI/GtAfiU=;\n b=h16QtNehE13q2APVGRNCeEMKpMfldJrbGJvTDRVuABLEbYt7oxYkLRAKNQmg8+ALzaizen8Ym\n oTUbxYvehAQAfOzzKGbEuTXlBrnsFx/opjcwaZoxHAsuIZrsrWNLFup","X-Developer-Key":"i=jorge.marques@analog.com; a=ed25519;\n pk=NUR1IZZMH0Da3QbJ2tBSznSPVfRpuoWdhBzKGSpAdbg=","X-ADIRuleOP-NewSCL":"Rule Triggered","X-Proofpoint-ORIG-GUID":"ckUSgF4LPP59bHdYNifnVx-5YPN-zhUu","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjUxMjE3MDA5NSBTYWx0ZWRfX6dHUfdknNgPL\n 9FVSstJkgNDxfckZxjcWQB2/JmskCToaAi252B97jS86QmiMPPZOOZUUO7pLeJnELJTFScuMOBQ\n gt5ZGmYRyIUsq/hlrSzIXyWwCko4hl9gxChnxYKNeCm2EC/t5P6ApxQbtkMP9ZF1wzdrR7Vz9Rg\n OmSiLmbGzLujoio7rGtGkzsqQ7AZKD9Ts5RlRDcjgeGHFSo1bTjMMdQ/YVIQsZWjmoLJbnDmemq\n iDcNQgvbw/IlYgB9Xj9xzhVqOKee2zw9fbptimU5YqNWcbQ+ZGmAMDV/Fsgzv3ktlpmhhkjMyO7\n 0y6T4xArldYx3tBAetS4ADcVeZ/4/mp3i1/S9kd0I2+HEBoWE68w6C6PJ2mSeSm4VS2nee2dY5q\n ASsFPXI1zFvjycYpCs5DSh0VzMHs2A==","X-Authority-Analysis":"v=2.4 cv=YqsChoYX c=1 sm=1 tr=0 ts=69429e8f cx=c_pps\n a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17\n a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22\n a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=xMyuZJbwAj7bCYiyej4A:9 a=QEXdDO2ut3YA:10","X-Proofpoint-GUID":"ckUSgF4LPP59bHdYNifnVx-5YPN-zhUu","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49\n definitions=2025-12-17_01,2025-12-16_05,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n spamscore=0 malwarescore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0\n phishscore=0 impostorscore=0 clxscore=1011 adultscore=0 priorityscore=1501\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2512170095"},"content":"When gp0 or gp1 is not taken as an interrupt, expose them as GPO if\ngpio-contoller is set in the devicetree. gpio-regmap is not used\nbecause the GPO static low is 'b101 and static high is 0b110; low state\nrequires setting bit 0, not fitting the abstraction of low=0 and\nhigh=mask.\n\nSigned-off-by: Jorge Marques <jorge.marques@analog.com>\nReviewed-by: Linus Walleij <linusw@kernel.org>\n---\n drivers/iio/adc/ad4062.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 125 insertions(+)","diff":"diff --git a/drivers/iio/adc/ad4062.c b/drivers/iio/adc/ad4062.c\nindex 2084f0058627d..a6b3ccc98acfc 100644\n--- a/drivers/iio/adc/ad4062.c\n+++ b/drivers/iio/adc/ad4062.c\n@@ -11,6 +11,7 @@\n #include <linux/delay.h>\n #include <linux/devm-helpers.h>\n #include <linux/err.h>\n+#include <linux/gpio/driver.h>\n #include <linux/i3c/device.h>\n #include <linux/i3c/master.h>\n #include <linux/iio/buffer.h>\n@@ -88,8 +89,11 @@\n #define AD4060_PROD_ID\t\t0x7A\n #define AD4062_PROD_ID\t\t0x7C\n \n+#define AD4062_GP_DISABLED\t0x0\n #define AD4062_GP_INTR\t\t0x1\n #define AD4062_GP_DRDY\t\t0x2\n+#define AD4062_GP_STATIC_LOW\t0x5\n+#define AD4062_GP_STATIC_HIGH\t0x6\n \n #define AD4062_LIMIT_BITS\t12\n \n@@ -687,12 +691,14 @@ static int ad4062_request_irq(struct iio_dev *indio_dev)\n \t\treturn ret;\n \n \tif (ret < 0) {\n+\t\tst->gpo_irq[0] = false;\n \t\tret = regmap_update_bits(st->regmap, AD4062_REG_ADC_IBI_EN,\n \t\t\t\t\t AD4062_REG_ADC_IBI_EN_MAX | AD4062_REG_ADC_IBI_EN_MIN,\n \t\t\t\t\t AD4062_REG_ADC_IBI_EN_MAX | AD4062_REG_ADC_IBI_EN_MIN);\n \t\tif (ret)\n \t\t\treturn ret;\n \t} else {\n+\t\tst->gpo_irq[0] = true;\n \t\tret = devm_request_threaded_irq(dev, ret, NULL,\n \t\t\t\t\t\tad4062_irq_handler_thresh,\n \t\t\t\t\t\tIRQF_ONESHOT, indio_dev->name,\n@@ -1347,6 +1353,121 @@ static int ad4062_regulators_get(struct ad4062_state *st, bool *ref_sel)\n \treturn 0;\n }\n \n+static int ad4062_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)\n+{\n+\treturn GPIO_LINE_DIRECTION_OUT;\n+}\n+\n+static int ad4062_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)\n+{\n+\tstruct ad4062_state *st = gpiochip_get_data(gc);\n+\tunsigned int reg_val = value ? AD4062_GP_STATIC_HIGH : AD4062_GP_STATIC_LOW;\n+\n+\tif (offset)\n+\t\treturn regmap_update_bits(st->regmap, AD4062_REG_GP_CONF,\n+\t\t\t\t\t  AD4062_REG_GP_CONF_MODE_MSK_1,\n+\t\t\t\t\t  FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_1, reg_val));\n+\telse\n+\t\treturn regmap_update_bits(st->regmap, AD4062_REG_GP_CONF,\n+\t\t\t\t\t  AD4062_REG_GP_CONF_MODE_MSK_0,\n+\t\t\t\t\t  FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_0, reg_val));\n+}\n+\n+static int ad4062_gpio_get(struct gpio_chip *gc, unsigned int offset)\n+{\n+\tstruct ad4062_state *st = gpiochip_get_data(gc);\n+\tunsigned int reg_val;\n+\tint ret;\n+\n+\tret = regmap_read(st->regmap, AD4062_REG_GP_CONF, &reg_val);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (offset)\n+\t\treg_val = FIELD_GET(AD4062_REG_GP_CONF_MODE_MSK_1, reg_val);\n+\telse\n+\t\treg_val = FIELD_GET(AD4062_REG_GP_CONF_MODE_MSK_0, reg_val);\n+\n+\treturn reg_val == AD4062_GP_STATIC_HIGH;\n+}\n+\n+static void ad4062_gpio_disable(void *data)\n+{\n+\tstruct ad4062_state *st = data;\n+\tu8 val = FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_0, AD4062_GP_DISABLED) |\n+\t\t FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_1, AD4062_GP_DISABLED);\n+\n+\tregmap_update_bits(st->regmap, AD4062_REG_GP_CONF,\n+\t\t\t   AD4062_REG_GP_CONF_MODE_MSK_1 | AD4062_REG_GP_CONF_MODE_MSK_0,\n+\t\t\t   val);\n+}\n+\n+static int ad4062_gpio_init_valid_mask(struct gpio_chip *gc,\n+\t\t\t\t       unsigned long *valid_mask,\n+\t\t\t\t       unsigned int ngpios)\n+{\n+\tstruct ad4062_state *st = gpiochip_get_data(gc);\n+\n+\tbitmap_zero(valid_mask, ngpios);\n+\n+\tfor (unsigned int i = 0; i < ARRAY_SIZE(st->gpo_irq); i++)\n+\t\t__assign_bit(i, valid_mask, !st->gpo_irq[i]);\n+\n+\treturn 0;\n+}\n+\n+static int ad4062_gpio_init(struct ad4062_state *st)\n+{\n+\tstruct device *dev = &st->i3cdev->dev;\n+\tstruct gpio_chip *gc;\n+\tu8 val, mask;\n+\tint ret;\n+\n+\tif (!device_property_read_bool(dev, \"gpio-controller\"))\n+\t\treturn 0;\n+\n+\tgc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL);\n+\tif (!gc)\n+\t\treturn -ENOMEM;\n+\n+\tval = 0;\n+\tmask = 0;\n+\tif (!st->gpo_irq[0]) {\n+\t\tmask |= AD4062_REG_GP_CONF_MODE_MSK_0;\n+\t\tval |= FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_0, AD4062_GP_STATIC_LOW);\n+\t}\n+\tif (!st->gpo_irq[1]) {\n+\t\tmask |= AD4062_REG_GP_CONF_MODE_MSK_1;\n+\t\tval |= FIELD_PREP(AD4062_REG_GP_CONF_MODE_MSK_1, AD4062_GP_STATIC_LOW);\n+\t}\n+\n+\tret = regmap_update_bits(st->regmap, AD4062_REG_GP_CONF,\n+\t\t\t\t mask, val);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = devm_add_action_or_reset(dev, ad4062_gpio_disable, st);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tgc->parent = dev;\n+\tgc->label = st->chip->name;\n+\tgc->owner = THIS_MODULE;\n+\tgc->base = -1;\n+\tgc->ngpio = 2;\n+\tgc->init_valid_mask = ad4062_gpio_init_valid_mask;\n+\tgc->get_direction = ad4062_gpio_get_direction;\n+\tgc->set = ad4062_gpio_set;\n+\tgc->get = ad4062_gpio_get;\n+\tgc->can_sleep = true;\n+\n+\tret = devm_gpiochip_add_data(dev, gc, st);\n+\tif (ret)\n+\t\treturn dev_err_probe(dev, ret, \"Unable to register GPIO chip\\n\");\n+\n+\treturn 0;\n+}\n+\n static const struct i3c_device_id ad4062_id_table[] = {\n \tI3C_DEVICE(AD4062_I3C_VENDOR, AD4060_PROD_ID, &ad4060_chip_info),\n \tI3C_DEVICE(AD4062_I3C_VENDOR, AD4062_PROD_ID, &ad4062_chip_info),\n@@ -1435,6 +1556,10 @@ static int ad4062_probe(struct i3c_device *i3cdev)\n \tif (ret)\n \t\treturn dev_err_probe(dev, ret, \"Failed to request i3c ibi\\n\");\n \n+\tret = ad4062_gpio_init(st);\n+\tif (ret)\n+\t\treturn ret;\n+\n \tret = devm_work_autocancel(dev, &st->trig_conv, ad4062_trigger_work);\n \tif (ret)\n \t\treturn ret;\n","prefixes":["v4","9/9"]}