From nobody Fri Apr 3 01:24:06 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB6243B2FC6 for ; Wed, 25 Mar 2026 10:18:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774433927; cv=none; b=QO4mKKs4zaD6wD18nivYpctZm2K3MC7iKNqAcLdMmwLX3t9GSaskmkUvMEWGKuzu/pbrhS6dwmz4buMbfFHvI3q03giLuYHjWLgeGuICsNcnx7zPaJpUyZMbufcIes9jIoLQ91X8VocmNRj9CfY0RMrLIp3KOpcNcd5HLLEocMc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774433927; c=relaxed/simple; bh=upm5nVM6kPq3mYUHZTeXnTQlCYL0wpRlbP5OgA/r7WE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=B4rlKvjIQbR/PaBXCIAJJAVyKHZ8lMQL+oBU9Nt+DEKNiGCSEGIhHXUWnjsi54tX9d4lFqokLC79l0rPJIMXDhg17vMtb++k4uEPwfGmktW6xH2SQ0FiEx7yRROVNhuK+C+XcAsKSJ+A6qwXShGJMg9iQDyHbCXa6NsMrPQTy4w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fEebZA1X; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EH9n4caw; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fEebZA1X"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EH9n4caw" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62PAEGRd919620 for ; Wed, 25 Mar 2026 10:18:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=To08I+ejB3z/JqhwSWUj+t IPIu5mncu7meWph1sJRzU=; b=fEebZA1X8Ue9dpbbQIciny7e+Ml7nRjUHIsokt CrUwr9z0FfF4VZjqNgcBFROo4xGpD13sRlXBT9DDAS6CihTJ0wyQLNM7IulkQ81D WysAHVqcaYIELRBpfXZ7rMwJb37sj4G5JvNSF+IlJs/+dvP/iPia+MSnx5F9KKh4 9FXDywGetVjSPEs3zHaAhIHYlSAlRV3//fwf2RhyIbRHyT35MlIugUr1afc5e3Rv UPdYzI32DtpA9Rfu26geuHMOqGycqiKoW1VHnD4oDgvP1JxbulsnDLgdG0YWRlDQ /c7AKLJ/10FT1Tz0NgRYEvBfXL5mMDYB5qT3Fmqj1NiwzZFg== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d489mhatj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 25 Mar 2026 10:18:44 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-5093787e2fdso316244741cf.2 for ; Wed, 25 Mar 2026 03:18:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774433923; x=1775038723; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=To08I+ejB3z/JqhwSWUj+tIPIu5mncu7meWph1sJRzU=; b=EH9n4cawTTd6SUWsTEviVmoQKiXtHoD/6iIhNYePdlUTAShumdDEe4lp0PsCqtHTs8 6RU3QBs6Ghkqe25RNHKWCqEsxq0Dw4hwLAJp4AorJb7+mej+mE85qssOj9LCOz0CvE+Y afj0BeTAue62MLYMD9UZz52Csj/Tb5VQmO5SEhwxOHAstVTIOb+U4rZ0TQKIz0PrUtEI Kchm4VS3mf2dR08ePLOGYLmTAqP3Y1BU0wGvhJAAzgNdwq5gXwcminggrnG3dR04gXiT 3IuHL5IKqhNCMK2MSKiRi/jeMSklVv89bDe3SVEbRc50IYCmqzVReKaKzi16+tnT2nRB ianw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774433923; x=1775038723; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=To08I+ejB3z/JqhwSWUj+tIPIu5mncu7meWph1sJRzU=; b=KP+KZljMeVEfKcau2KKUTDubUpuoR3I4HzVgfD20agqkx1hpruBmX38jg6L4HH2LjY +vc+WRyI73fSmhPWAF+P3+M6tnjhvyW/KlyhM1Gtsms0QxTItCNLSar3VG+EVl1Ch8G7 lJXvF2e0VsI4F6j8942CybKMcyN4OanumAiaBoR20KpsZ2AE7VyluC88w4NVXw4zlF0k m/Z6s+Fq/riRENhDaemC5Uv9V5nykvPizeQBA6a5FNo+I/ckqqO0aKdQJuLq8+k7uqi1 NfZ8Dsho43/JTH3UXvwrPxz1hmgN0SwNXBkNyxaQ9YUhkICuHnqNwKkYIAcIwGJq4UHN yS7A== X-Forwarded-Encrypted: i=1; AJvYcCX2r9hr3C+rGcayYiSXAd9n1YLdBkU2Fxxkm/oWcbuLpQ/hy9rd8+Ad2bk191DCE5mcZ3ySGzTbgkBlWuE=@vger.kernel.org X-Gm-Message-State: AOJu0YyKQYrOuG7I4jxHFQJYJDQWnCA+2WO8tnpSWlQoldBjdgdg1Bds FSbC37uchPkweyM/U8JUoPViCyi0vqvEjxbEEP9rehBenfdex8nrtY7/TnY9WPLhup4omyeJExR rJtagxs5HK3xRCMboZdz6Io7DYarG8LWU9yv9n6IHvFzV8reh8+uv3l7wbbIwFJZ58IiiF4bJ6c s= X-Gm-Gg: ATEYQzziCdK8NJSz7JSS5MgqK9yhAKCM356rh73qOoSUh5zvikzGwTEhyeQ8JZ8nR8l 9+YxcGpOmOe/0TC2LZ6Pq6avH5OgHwoH84SBAuJLg38CRDdKp5U6KV71mSoFpA1gYai2p9Bfvu1 SIjWaNrhRg5gwhAkSjdFNblo4QIoVqjgci8plxwPn5QU+V6HA39WhCiLPS8h+7E2Xl287KPp4K5 HWfkTdGIfxoMeiypngcxBoIFHrFLDTfKEJC255bpPNtI3x0p6I4vL6TwE66JjztgMtS+nx31DlQ C/yQeNDxeELMYVSmBatc6mokAHSjHp2vVR8BZQidSrqfCsCfoyz9/nozkm4qrKa8YJrleGEs67f W1s6hJmESDRD9gR1qYWcIrQgr0kqyyRZwYjPJTQQKDwwcwx6nqcZD X-Received: by 2002:ac8:5ac6:0:b0:50b:3ff3:f494 with SMTP id d75a77b69052e-50b80e0be23mr39718451cf.36.1774433923002; Wed, 25 Mar 2026 03:18:43 -0700 (PDT) X-Received: by 2002:ac8:5ac6:0:b0:50b:3ff3:f494 with SMTP id d75a77b69052e-50b80e0be23mr39718131cf.36.1774433922554; Wed, 25 Mar 2026 03:18:42 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:7116:95af:5a1a:58c1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48716547649sm34627175e9.0.2026.03.25.03.18.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2026 03:18:41 -0700 (PDT) From: Bartosz Golaszewski Date: Wed, 25 Mar 2026 11:18:32 +0100 Subject: [PATCH] gpiolib: fix hogs with multiple lines Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260325-gpio-hogs-multiple-v1-1-7e3a7347f0d6@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAHe2w2kC/x3MTQqAIBBA4avErBtIo5KuEi36mWygVLQiEO+et PwW70UI5JkC9EUETw8HtiZDlAUs+2Q0Ia/ZICvZVrVsUDu2uFsd8LyPi91BKDqh1lotYmtmyKH ztPH7T4cxpQ8wqy8NZAAAAA== X-Change-ID: 20260325-gpio-hogs-multiple-1718d38c1f5b To: Linus Walleij , Bartosz Golaszewski , Mika Westerberg , Andy Shevchenko Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4434; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=upm5nVM6kPq3mYUHZTeXnTQlCYL0wpRlbP5OgA/r7WE=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpw7Z8/KkiXTi/PKquMou0xQbysDdIelEZungnJ 0kdJkyXteyJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCacO2fAAKCRAFnS7L/zaE w48nD/4jZlDtvWs0GcRAhNZUvFk6TVJ2SoOjx7lbTs5wlm/mRxSSNLJjR1EFDAHXSe1FUw5F1h+ EhpbQ75f8Wx70FQCip7b6TRnRmcgf4zNIor1UcPRddUgkEZxjUr3ZS1xeG00qOsfDddx+7aw86B O/kDOoCYZkC61zngRID0QKWhEUywp2Lvzbk1M9A2GKukAm6rlugRGt0TPD7j0JoDQRGrK2XDiID RkQCADuImCbVGf4MekUarAZt0xsB9LtVPJREysSa3V01DSaAe3QI/CTLPlIpaoyYba68QWlv2yn IXhXNmQoFrWQm16yWzdYegzHAeji30cXGyI6jVbedgIUr2LsWSiOcxjGZaIbQ3uqH8xHhFjl1NF kaIvDYLSuvr5XFtJeFrxui42Lp7H01c/rTp5qKVWwq0l7ljempWRr51OO14uMci4SqpqEKHnp9A EjYdVoxhrHUp6qgtI72Ijfih422cgZwY27AH70Ig9CY+IhF2ZFxEyKLarDxQ61U9Na6HC3K1TC5 gbGGLXPrZoEt9Hwa5uBIH5Kp3Zg9kByun7/oOf61RClTHXB2K/878CZZ/iroiL/OyW7ENP7nccv ajj1K7RX0hAXiNecPtpRxk1kA9QnmXjbTUob5oDUARDNUhDmWVPgzp7FhKSXLja01Jf+qldqF6S ODATue8NOTQ6MCw== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzI1MDA3MiBTYWx0ZWRfX4c44coIVnutc a6+LvprtnMo5jpYknmRRO015/iFQQ9Zxzjhcgy9916mHpDc8/6/6ddw/ECc9/SEwIOS/JS5i2ZW UWodzogKGvaPgNiQ6496LWQo4RkRt2X0TFPMDqNUR/A39S3QNPx27KaI292EK1QlxFDDcw/CEWk Q2y3AzuroCur9OVpyAucmFnQAssabMF58aVPJiz4Bl6dj+dunpS54/1JEHbZ6kOCBYeAQ7TWPSw Fg88V8KmjOF4/kcO9ASZVhBu0BHR7md4qFbXeXU4wsaJD61gTzB6SjrBrsySzHJ+BLJQJTu3VWF zRuO6fsnd/FvkCOMNmmi2rN8K2ZBhFSY+LvqVWSR0jZkJJxKDmMRg56+1Zj0MO2BbOtbU97Wi7w 0i0jjJkmnN5BQtrxaC9XVTfn+GPTAnI7k0DqrDnHafLxKGfFiR4E/gYkqe40cTFo+x61GN5dfCO qAoEiFof6DPHJi4K4eA== X-Proofpoint-GUID: njMts0fvz8V5j-bs-VsW31gos-QY3qNo X-Proofpoint-ORIG-GUID: njMts0fvz8V5j-bs-VsW31gos-QY3qNo X-Authority-Analysis: v=2.4 cv=AKSYvs3t c=1 sm=1 tr=0 ts=69c3b684 cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=VwQbUJbxAAAA:8 a=pGLkceISAAAA:8 a=tBb2bbeoAAAA:8 a=EUspDBNiAAAA:8 a=K1GLRSYOeZ-nItpvw9AA:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 a=Oj-tNtZlA1e06AYgeCfH:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-25_03,2026-03-24_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 bulkscore=0 clxscore=1015 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603250072 After moving GPIO hog handling into GPIOLIB core, we accidentally stopped supporting devicetree hog definitions with multiple lines like so: hog { gpio-hog; gpios =3D <3 0>, <4 GPIO_ACTIVE_LOW>; output-high; line-name =3D "foo"; }; Restore this functionality to fix reported regressions. Fixes: d1d564ec4992 ("gpio: move hogs into GPIO core") Reported-by: Geert Uytterhoeven Closes: https://lore.kernel.org/all/CAMuHMdX6RuZXAozrF5m625ZepJTVVr4pcyKczS= k12MedWvoejw@mail.gmail.com/ Signed-off-by: Bartosz Golaszewski Tested-by: Geert Uytterhoeven --- drivers/gpio/gpiolib.c | 84 +++++++++++++++++++++++++++-------------------= ---- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 7ee45ccdf1265e94b68fe8fa0d10dbc6adccd93a..fd2821463ddc9fe047fecb3d89b= 018b5e23b925c 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -938,12 +938,12 @@ int gpiochip_add_hog(struct gpio_chip *gc, struct fwn= ode_handle *fwnode) struct fwnode_handle *gc_node =3D dev_fwnode(&gc->gpiodev->dev); struct fwnode_reference_args gpiospec; enum gpiod_flags dflags; + const char *name =3D NULL; struct gpio_desc *desc; unsigned long lflags; - const char *name; + size_t num_hogs; int ret, argc; - u32 gpios[3]; /* We support up to three-cell bindings. */ - u32 cells; + u32 cells =3D 0; =20 lflags =3D GPIO_LOOKUP_FLAGS_DEFAULT; dflags =3D GPIOD_ASIS; @@ -952,43 +952,21 @@ int gpiochip_add_hog(struct gpio_chip *gc, struct fwn= ode_handle *fwnode) argc =3D fwnode_property_count_u32(fwnode, "gpios"); if (argc < 0) return argc; - if (argc > 3) + + ret =3D fwnode_property_read_u32(gc_node, "#gpio-cells", &cells); + if ((ret && is_of_node(fwnode)) || (!ret && (argc % cells))) return -EINVAL; =20 + num_hogs =3D ret ? 1 : (argc / cells); + + u32 *gpios __free(kfree) =3D kcalloc(argc, sizeof(u32), GFP_KERNEL); + if (!gpios) + return -ENOMEM; + ret =3D fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc); if (ret < 0) return ret; =20 - if (is_of_node(fwnode)) { - /* - * OF-nodes need some additional special handling for - * translating of devicetree flags. - */ - ret =3D fwnode_property_read_u32(gc_node, "#gpio-cells", &cells); - if (ret) - return ret; - if (!ret && argc !=3D cells) - return -EINVAL; - - memset(&gpiospec, 0, sizeof(gpiospec)); - gpiospec.fwnode =3D fwnode; - gpiospec.nargs =3D argc; - - for (int i =3D 0; i < argc; i++) - gpiospec.args[i] =3D gpios[i]; - - ret =3D of_gpiochip_get_lflags(gc, &gpiospec, &lflags); - if (ret) - return ret; - } else { - /* - * GPIO_ACTIVE_LOW is currently the only lookup flag - * supported for non-OF firmware nodes. - */ - if (gpios[1]) - lflags |=3D GPIO_ACTIVE_LOW; - } - if (fwnode_property_present(fwnode, "input")) dflags |=3D GPIOD_IN; else if (fwnode_property_present(fwnode, "output-low")) @@ -1000,11 +978,41 @@ int gpiochip_add_hog(struct gpio_chip *gc, struct fw= node_handle *fwnode) =20 fwnode_property_read_string(fwnode, "line-name", &name); =20 - desc =3D gpiochip_get_desc(gc, gpios[0]); - if (IS_ERR(desc)) - return PTR_ERR(desc); + for (unsigned int i =3D 0; i < num_hogs; i++) { + if (is_of_node(fwnode)) { + /* + * OF-nodes need some additional special handling for + * translating of devicetree flags. + */ + memset(&gpiospec, 0, sizeof(gpiospec)); + gpiospec.fwnode =3D fwnode; + gpiospec.nargs =3D cells; + + for (int j =3D 0; j < cells; j++) + gpiospec.args[j] =3D gpios[i * cells + j]; + + ret =3D of_gpiochip_get_lflags(gc, &gpiospec, &lflags); + if (ret) + return ret; + } else { + /* + * GPIO_ACTIVE_LOW is currently the only lookup flag + * supported for non-OF firmware nodes. + */ + if (gpios[i * cells + 1]) + lflags |=3D GPIO_ACTIVE_LOW; + } =20 - return gpiod_hog(desc, name, lflags, dflags); + desc =3D gpiochip_get_desc(gc, gpios[i * cells]); + if (IS_ERR(desc)) + return PTR_ERR(desc); + + ret =3D gpiod_hog(desc, name, lflags, dflags); + if (ret) + return ret; + } + + return 0; } =20 static int gpiochip_hog_lines(struct gpio_chip *gc) --- base-commit: 04310bd443d4a09a486c0bcd7a767e32400eca77 change-id: 20260325-gpio-hogs-multiple-1718d38c1f5b Best regards, --=20 Bartosz Golaszewski