From nobody Mon Apr 6 10:36:57 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 104053AEF27 for ; Mon, 30 Mar 2026 08:36:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774859778; cv=none; b=CUz479swi8Q1LqCkSfNQofq4JyJto/QrdKClRbZ5XettvETCbN05c/CrC5H7WFQvHfD29VYH2cNHIwZkQIu4ZCQ8JWksKasu6kU9BJRQx7VyHoiqTunQ+ZX8SCCoR2l2PurHLW4qIsrGc7I7uABh5yiS3bR0XwRYMdnaBEkhmo4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774859778; c=relaxed/simple; bh=anCW4E0ZIGfXhJLFTLzLNgLyYjg6VA1+mUORsy7w8AY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=U1uE8t8WU3QuM4G8gtguT49T/Sc/7duiuLOjkOfmVVioAGP89yukKVHUQbF8DgIijXvvbstUPsRsdJhvafvOdQu7b5MVLldcL8RRMOKiyymT9Dn89ihb0HviZ/NfKvKbzW1WtKvkl9HqcVU9n5FEpMNThtt3Kk9bfngwvlhS6Kc= 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=h8VVM2xq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=JFwEm9Gz; arc=none smtp.client-ip=205.220.180.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="h8VVM2xq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="JFwEm9Gz" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62U7eUe81575802 for ; Mon, 30 Mar 2026 08:36:16 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=WiitO0Rwk/4O9hM9vTx4GO 7pPaNREZlLqZTvSluTHQM=; b=h8VVM2xqAetF9KqOCTl9h4nR3tT9UqQdxe5pre YCb8OL81JokRlvqldUQyMctN0UzjYTbc6R+uw2lGNY5+Ev3eZy37cuI9euNc/bcD vKz3Ym+8gCawEuQkhXIRsDGM6bqBcANiFqYjNncCOlz6aDyg7lrImQmrmKZBQbHL FaKWzXL3J8S5iYqc7BahG0wcuhimnIJ11KedPvqkGwtEaVLHSFEKZR64hR9fzyN6 obWc80SxdWTeYSL0MsTby/jRWfOrU1bl+69NB4EIujU4G7gc80ADBatek/Kb4LRE 5Zeoyhl8jhBVPvlyPyFU57INlVeOIp2JmCXDLvc/Q1EvR0fA== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d66jwnagd-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 30 Mar 2026 08:36:15 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-5094741c1c1so105596061cf.1 for ; Mon, 30 Mar 2026 01:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774859775; x=1775464575; 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=WiitO0Rwk/4O9hM9vTx4GO7pPaNREZlLqZTvSluTHQM=; b=JFwEm9Gz/dupmCIBV7fTltYz0kdRj8Mih4uta5vFKVw9ahsFBj7GVkeXeobiXVcYc5 VHtHWZPrYdAvHxtdRcyTADoA88R8stoFXr3ZZewl4fFhp5WuBUbQPkUvrnj4p6GdjEsV uGP2z7NpretgZiSsAbpT6cRsnIA1mVFz2sIZyXBSQxziLPggbFyzqCL+pMEOUAu68uZZ HCA38oblyEDbEglN7JV7dPr+mPWvi/9ZI1flcKd8hpzJgQpJfVU0jCqIEMazm45s4KXU +wsh/vim4Oe8DDjMGZyS+qQBYemRRns3cyva61l2n30yLFdo+1WI+licyIQDji3UsLJA LGOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774859775; x=1775464575; 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=WiitO0Rwk/4O9hM9vTx4GO7pPaNREZlLqZTvSluTHQM=; b=Yl7FfkYZJ4kgmKQ1oAe2jUNWW/z9FdHIVOXKRFcEUVZE8OYzLTrfamBAqdZiYzAL8a EPNR0PnPNJY/mwXGqwYwcKVBXr/6oVxjGVRKt4yKYYvWAo6ASQt+UxaSYCbLsc0zl7ox HZCpx0fRm+pd45teW6j+fWTYXGqZtB//RYZxYTy6F5TYNkoV/jgUMDrQmAmaGxpptiB9 k4hHphuhoxDsxYtc11krgdMLfdtx1taVQgW9M/+G3QTTDupJyshS5QsaxanUGsrqhzB/ z+XoLQOGa0bUXjXcfHoJ2aEfvaJhm12Ij5T8c6Ak7HO+BL5Q4M+ci33Bse6B1Gktt4Pz /ZaA== X-Forwarded-Encrypted: i=1; AJvYcCXyaAE/BiTRuhm+8UspaEr0hjUaH6B2Xj2FMLb0leehwt/5W4fQucRmg110tFScmEg0IhSqbBV5GLB8LFk=@vger.kernel.org X-Gm-Message-State: AOJu0YwnzlwnNLpMAYGKS82mvz+Vnoa3ZzUQOaxNs0abOj13LmYfHSux E9bQRI/fhhoK4e0jgVYroKEb1/SYqnuT+yutM2jtDiADyeA4HlDE+mjOMBHslBm8Sj16heRD3mK HeDPon8vjexHHgGurHdGQo91SAigjUIL0R2ZTDFN8QACtNdQ+c5Z9+SdlADdFDKLKj7U= X-Gm-Gg: ATEYQzz+XNYuojA2rwvR1Y66gfqwP/nv7dGbJvb63HC4uMtS3dSgTHW3czJTZaRUgt8 onySg/5+xCaXtk/cdDi5nbAtb3VhWbvdrwLGC544LfvPVdotpMcrLI9+zA0ap18kA+VGuTYnXGE Mb0Tp4xm1a3E4oyigMz1LqSvLYli8W4Q6K8QCXhqZ+3sr90Ls4/oxvBwJlKZx/HmXjuUl6nElwL yCPPtVKz3xi5zRY5aDhm2vyPYE2IHbBhrkv7Kx9gE2qjQgn2A6xOL2JyWNTdCzXT8TXKTwDwmhw Q3WoAbMy3nPbk2jCf1KtlLCRPUBCOq/FXXrOm7ylg5hfX0xfgWCVTMJTi65l/jgUnAgKk5P081b dBf2rt0MIuBiO4GOxJKZu5aUUtot7OVi6nR4qqUsvnkYgbQ5v/TS5 X-Received: by 2002:a05:622a:1ba0:b0:509:34b8:a373 with SMTP id d75a77b69052e-50ba38c25e3mr160915301cf.32.1774859775249; Mon, 30 Mar 2026 01:36:15 -0700 (PDT) X-Received: by 2002:a05:622a:1ba0:b0:509:34b8:a373 with SMTP id d75a77b69052e-50ba38c25e3mr160915061cf.32.1774859774779; Mon, 30 Mar 2026 01:36:14 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:1143:869f:e06c:4587]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43cf245f8a3sm18652219f8f.24.2026.03.30.01.36.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Mar 2026 01:36:13 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 30 Mar 2026 10:36:03 +0200 Subject: [PATCH v3] 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: <20260330-gpio-hogs-multiple-v3-1-175c3839ad9f@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAPI1ymkC/33NSwqDMBCA4atI1o3koYl01XuULmyc6IAam2hoE e/e6KoL6WbgH5hvVhLAIwRyzVbiIWJAN6aQl4yYrh5boNikJoIJxaQoaTuho51rAx2WfsapB8o 1rxpZGW7LJ0mHkweL7wO9P1J3GGbnP8ePyPftXy5yyqkGWWtZaMsadXMh5K+l7o0bhjwNsqtR/ ErqVBK7ZGTFZaEYFPZE2rbtC+0WtBoFAQAA X-Change-ID: 20260325-gpio-hogs-multiple-1718d38c1f5b To: Linus Walleij , Bartosz Golaszewski , Mika Westerberg , Andy Shevchenko , Geert Uytterhoeven 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=5349; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=anCW4E0ZIGfXhJLFTLzLNgLyYjg6VA1+mUORsy7w8AY=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpyjXzh89dCum1hpwJ7f0nmCEc24p187AIo2Ig1 M16Y+fblV2JAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaco18wAKCRAFnS7L/zaE w9IBD/9suGgwYLvz/LLQjUPtm435iWTwE9NX/kurJLjoo0RvMRPEtC6MN+HQJR1gZhyBpY6Iqvt Xn4SJE/MkUtPnVcmRGBelBpGvOE4E3SKvK9+o8MY+8SWbV7YWaSDlSzamFRDuoS0C4QrQSn/3vW Hhkbl//oLuvJJCF+tR7vcZtOu5VHJ5imsQysEbWalsU5XbLkn/Hzehzlen0CD6dz3U0DXEYXh2o TDb3NT4aoANY939bLUOt/ZMhYeriix8lFGd8ngYsBWuiomB3ZBMbr3rFGTVnypTYosYmzz9pOI5 8Asikiv8YwrBXqgWA/PWv9GSR/IAWm+FEQ8FVaKlkTA3Av23+gd4xTjWmzhVyVz4Ce3BEEi+EJj rKrdciVVThhNIYim0HMIe5kBB+R5LWHE/r4x2JE+I4r6qyzQbj6Q1hSARDLeqZfiRFGWKwntRwI 8SVTX9Q+gXkSoTC57lPtzO1Zl4Q5Vme1uGjiyu8zFJOxruRhdOjJ4FEwM4XqelsnfpNbAR0X7N3 yKoVAK84rhEhdkFf6MKJ+BHKjZXdxH+4o0pOP49mbNw3A1zksRoalqsIPohuriH0pENCX8KgfAL mFrNBJ/tcG0Jq/XcCBOvjdmkzgsRUaoHWsha8apn1qq+n4Tum2F8+a5XzAspn76F7ZhKh9ONtDQ aTAPEhl8n59UN/g== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Authority-Analysis: v=2.4 cv=I8dohdgg c=1 sm=1 tr=0 ts=69ca35ff cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=VwQbUJbxAAAA:8 a=pGLkceISAAAA:8 a=bC-a23v3AAAA:8 a=EUspDBNiAAAA:8 a=tBb2bbeoAAAA:8 a=1mqqY-Va1JI0pYqkum4A:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 a=FO4_E8m0qiDe52t0p3_H:22 a=Oj-tNtZlA1e06AYgeCfH:22 X-Proofpoint-GUID: mrhU_dp-3UoT7v15l3EX1vVOKqqA1-xQ X-Proofpoint-ORIG-GUID: mrhU_dp-3UoT7v15l3EX1vVOKqqA1-xQ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzMwMDA2NyBTYWx0ZWRfXzGrtxlifcqNk WkQQ12VCZ5T6vVmNQidzNSdiFwoMNYYIT9n1ZR3nq0190kw9jFFtwDh0HWW/by+nd1BWqF4Zgi1 sF3vTkxZjiJmQYkxDnHZ3MR2ReRqy8zhvykXUkQ3jvf9OLch+5f3QbKDkxRPjY6g/FmJ/R/jt6z eRz/ECPkC/MlsCC5URaJPxarmKTJjN+EJ4hs2CHAxtoLvQ3ycTBz7jVeVaEwUIeS9U49qG1n+NU G2WAFJ2oyTJqpSzFmToVLVL56hB7yMIZgYxnms0NvsNbaPZ+wCxSio6XTLLE6bKDo91Wa4GXwWG FjNNwqTWl1YDt1dqXa+lr53vmTT/jUnJfDH8L67ibbNtE8pjuHcIahb36nv79NZCww1FVQRSKEn JAxXLtyzIFW0ZQTzzMpEt7+6xy/9aSbyk8z32kxfifFxdelGTMlKNy0vaOR21u9+h0dzuH3sAtB 71qAiL2zHDoVNAToL1g== 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-29_05,2026-03-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 spamscore=0 adultscore=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603300067 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/ Tested-by: Geert Uytterhoeven Signed-off-by: Bartosz Golaszewski Reviewed-by: Geert Uytterhoeven Reviewed-by: Linus Walleij --- Changes in v3: - Fix types for some variables - Make the return value check for "#gpio-cells" property stricter - Link to v2: https://patch.msgid.link/20260326-gpio-hogs-multiple-v2-1-7c3= 813460e4f@oss.qualcomm.com Changes in v2: - Use a default value of 2 for the number of GPIO cells - Use kzalloc_objs() instead of kcalloc() - Propagate the error number from fwnode_property_read_u32() - Remove special cases forced by the lack of default cells value - Link to v1: https://patch.msgid.link/20260325-gpio-hogs-multiple-v1-1-7e3= a7347f0d6@oss.qualcomm.com --- drivers/gpio/gpiolib.c | 92 +++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 7ee45ccdf1265e94b68fe8fa0d10dbc6adccd93a..96c776ff2669ed2404048360297= cf706bfe38251 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -938,12 +938,18 @@ 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 int num_hogs; unsigned long lflags; - const char *name; int ret, argc; - u32 gpios[3]; /* We support up to three-cell bindings. */ - u32 cells; + /* + * For devicetree-based systems, this needs to be defined in bindings + * and there's no real default value. For other firmware descriptions + * it makes the most sense to use 2 cells for the GPIO offset and + * request flags. + */ + u32 cells =3D 2; =20 lflags =3D GPIO_LOOKUP_FLAGS_DEFAULT; dflags =3D GPIOD_ASIS; @@ -952,42 +958,22 @@ 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) - return -EINVAL; =20 - ret =3D fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc); - if (ret < 0) + ret =3D fwnode_property_read_u32(gc_node, "#gpio-cells", &cells); + if (ret && is_of_node(fwnode)) return ret; + if (argc % cells) + return -EINVAL; =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; + num_hogs =3D argc / cells; =20 - for (int i =3D 0; i < argc; i++) - gpiospec.args[i] =3D gpios[i]; + u32 *gpios __free(kfree) =3D kzalloc_objs(*gpios, argc); + if (!gpios) + return -ENOMEM; =20 - 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; - } + ret =3D fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc); + if (ret < 0) + return ret; =20 if (fwnode_property_present(fwnode, "input")) dflags |=3D GPIOD_IN; @@ -1000,11 +986,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 (unsigned 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; + } + + desc =3D gpiochip_get_desc(gc, gpios[i * cells]); + if (IS_ERR(desc)) + return PTR_ERR(desc); =20 - return gpiod_hog(desc, name, lflags, dflags); + 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: b99f90909bdc937914fd6017d67b66d445273650 change-id: 20260325-gpio-hogs-multiple-1718d38c1f5b Best regards, --=20 Bartosz Golaszewski