From nobody Thu Apr 2 20:20:31 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 E076C3D75C6 for ; Thu, 26 Mar 2026 14:18:29 +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=1774534714; cv=none; b=EyFZQ5sQZ9dCMPaXD7UFJNUnF4sv5h/0odo/IUg1Thz4dyjI2gTO8k5I4LfBePqeaWHZ61qeTBjhpN0NP6RRUujeCT80ZtZWrrp1RxvVQxbsNAzhZ1ETfA099/0BJLIVKdUkxMRFII9LDzxV7mLbyLvm7lvcjG+l1Dyyd67OP7M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774534714; c=relaxed/simple; bh=621EXQPHHp1oek5UIpVZlw/H7Y1Xhl7Qy8Kc/NSLT2Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=CU9CXqGnY05gFHFaOls/12kQcfSrmvZjNIFDzguanHmQPaK0GfloV8+dblONzjRSGrTSbDX6RquxRndS0fELfe5Si+Zrc/6jAXSHCXsOKeLUagRtFwNJEF+MiircyXuKu3Sbb1zy2NeiAO90JQ9rEKSXaAw6Ynr+YCBBnxPa+PQ= 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=MuObGuZ7; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jSCZ0AEh; 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="MuObGuZ7"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jSCZ0AEh" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62QDm8p53959161 for ; Thu, 26 Mar 2026 14:18:27 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=GRric16bnLzc3ebet/NeXU 0VKg20Q/aQFLGLCvrJZJ4=; b=MuObGuZ7xH678q1Be9ZSZOINz+AadwYZ9kFmbh Ehvpca4qN+8yysO8SP5gKOuO/4jSL2pMg45ks/6LMVImkaStr6xsB+7aMHOTxAQ+ EVTG9rJqhm8+z4UkbR0rcyXK6oahAuMpE470Abg7m6XZQ4nGSxNXdc1D+zyZbzoL cC0Q44kISZEMl8dZNGC3ORC/P0bKH2JIz3rNPXl0aLLlXBdWMZ3sztR2V6VsImjr V0lcBDdt+2wKs/cBn/U9/jalBz0o8d3SoWupRWYgvj+Nn5wW9bybE7Vp9COM/EDP HZy5NMATU7MTRyu20o1e1MFIjayChx0u1mCdX07BTzzYnIVg== Received: from mail-vs1-f71.google.com (mail-vs1-f71.google.com [209.85.217.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d4tjajgq5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 26 Mar 2026 14:18:26 +0000 (GMT) Received: by mail-vs1-f71.google.com with SMTP id ada2fe7eead31-5f58f90f83aso1438987137.0 for ; Thu, 26 Mar 2026 07:18:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774534706; x=1775139506; 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=GRric16bnLzc3ebet/NeXU0VKg20Q/aQFLGLCvrJZJ4=; b=jSCZ0AEhCGG+03nLOFa4ojeFRcyaUS9i3SxNEFKtb4P83/Wk1VRjakoM7nppEdO6yR VQPrZO93Kb3CBT05j2+JG+BfAn8/hDU/z6rYkpaSQPocEAvXkrvNGbHlqe4GYmKy/RGv CSjfQBJreaQzM1kmg65rZh2MJwwga5AYSYP6gtb39KOsiKHcMXG96cKDZSe2RAdBKePX qNBMfCs8g1Bim3qm+qccpIDraReIQlZMYNpGL1lY6Az9MXCM9of56umpm9aG28EeQOlB qHnoPyP3w3NqvDyI4cJ++d91ZWRArBR5ISv6qFo3wAEXs5Tr4ybGWxhtrBdeANcicbyS ptOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774534706; x=1775139506; 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=GRric16bnLzc3ebet/NeXU0VKg20Q/aQFLGLCvrJZJ4=; b=hNoRitSl/HrxVbS+I3onaDwU7jvQKv4v54ixkl1Vbwn2a1XTcgdqg7y0S0Wbq15boE whfJ/snFeVCcam7zRZaZsSsF22c89r1KqA/NI1JjbOgHSB4/ZZkHCr9Piuq/As+fJVnc sQVgAgCkfhj7YC1MEr4tvEm/Y0m8ETX7PCKdht9aPPAzG1Q712vjgcHEMiBPVQMsjLbX MFsf2513CPhb+BnH2B47cI6Sr258+dTyxz7nlruTDczNJu1p+oLGnJDISIi4aPqB8Vmy 4amIbvfjZQ6h8KZrszKZXkKKku17jTLpZeETT0pj8mytizwoYNXWxk8yXBTA0lK0CBnB kjVQ== X-Forwarded-Encrypted: i=1; AJvYcCW8q1Uxk+SbXCFgnh5cgiY5rTG1GL0nAFxtBs+dDe3QTr48I3eueO5QIimGcefK0c5xzyJAHJ8REQqKDdI=@vger.kernel.org X-Gm-Message-State: AOJu0YyooZmhQrgRX8V0N/diMePDPBC1N6EXNOZ1CgfZf8BayFkBc2gf svv/iay9i/coXSzvBuflPlHwKrzkQWimEOvYdmpkgidPs/fb4vy0SVnQhk18mzlNSuv4dC0Xg9i zHsQCZ4DxusuYWUovpm0P6pJOxFSmSvzaypTdlmhI77uBVbTBoQvoIB36l8qs5Qf2ZwA= X-Gm-Gg: ATEYQzwwo9u0szDXiSUcbKzY0lNPlX4rfGfyuvgT54x8tb4iNHfz8XucYoeQFjLja0V sMizjteXq+A8BJHoj17GkpYGRPsuS40bLPLTdT9fKKBif4tFZPfW5cb/8tL86vGGKCmUgUjHUkh 6OaxLdMXV+6JGFSwV+EWxKMcO74lIlZrlqqPIOjHCKkIdhaZyy4EdtTIjbW5gf1Y/ZktPbesygj EWn2jRLEu3pLA8o0CnMN5P/OJASgcKZSkAVfMLYkliWDEKJ94/OztqEGzvg58WkRQWofoGUBHkB jhg9Dpqig5miNbOQMLA1OMxDAexLVN/J6lQ8pE8f6L2OLYCxwwCZ/0AAwpc0RkppbsehZtDJFfO yrs8CaItLF14fuq2kItPRCqGD0LeBatNc87o0gsqOIxv8AuADYrte X-Received: by 2002:a05:6102:4b0f:b0:602:91f2:6af6 with SMTP id ada2fe7eead31-60387292b42mr3666439137.17.1774534705908; Thu, 26 Mar 2026 07:18:25 -0700 (PDT) X-Received: by 2002:a05:6102:4b0f:b0:602:91f2:6af6 with SMTP id ada2fe7eead31-60387292b42mr3666405137.17.1774534705399; Thu, 26 Mar 2026 07:18:25 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:f36c:4a15:cca2:5268]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48722ca344dsm28405845e9.12.2026.03.26.07.18.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 07:18:24 -0700 (PDT) From: Bartosz Golaszewski Date: Thu, 26 Mar 2026 15:18:18 +0100 Subject: [PATCH v2] 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: <20260326-gpio-hogs-multiple-v2-1-7c3813460e4f@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAClAxWkC/32NQQqDMBBFryKz7ohJqpGueo/iwuqoA2rSjEqLe PemHqCbD+/Df38HocAkcEt2CLSxsJsj6EsCzVDPPSG3kUFnusiMzrH37HBwveC0jgv7kVBZVba mbFSXPyEOfaCO36f0UUUeWBYXPufHpn7tX92mUKElU1tztV3WFncnkr7WemzcNKUxoDqO4wuwB k8yuwAAAA== 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=5124; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=621EXQPHHp1oek5UIpVZlw/H7Y1Xhl7Qy8Kc/NSLT2Q=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpxUArTpjhGsVZVIEntVMWwNw3iQyN+Y78frkYb 5UhD+ibRAyJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCacVAKwAKCRAFnS7L/zaE wzl6D/9ldtf3KeWmDokFrdBitjh2JJKcql0g7eFtpgGt1FVnIOTbZOA2FiONBfwgts4iz8tU/KR WRUJ9ZtFn/JQGf0LHfMlm6tOOZYNR6kJ5n+u9DlK3xE1YPuiGbJUXxUAty/NxZj7vYu/RTmlmEj 6tAaHH93aT9sr2SmRIy5QHmVHXd6rgEJTYGMdvsZB6nEohH/udJQfbnbEHPxgVvxwLCZpLgUBTG u2iycFLnJT0rhJdW1IgXRJazcQ9C5X3osncY8+TkKbGWnI9KOu2rL2q/Mr7slrmOYfZho/R6A2j XAiCjt9uoUN0fpNkSliZ/N54XIUbYaSCtsEuqOVqq5o2xyqd2hd+hnvPm8pfg59bsq5DHlG9Q55 Msdayck32M6uBLIEIAWxBGItz9E1dY19ldmIwoFNfpkXwtVtopW85SgyEQfilgaZM+SLgVRwJwy 7aMk66JgeMbFGYPdWyNLhfF/3SF7Bi8oc85P7tZsY2Yu9HQ6hq2jT9J5P3a/IOBSKVchZJ9p0/T TvbgB5+8sOV8tfconne9rp9aMStaBpFlXC7W9Gc3ZyN6aGiykRODRcyKyf/YdTCDM89TJRUc6LW qYVTVKk04aYGnTOIWig5jDb202Xj+uFESABrtrtsHV+ku1N8bc53WiWB1Go4SlZspdAeVFBHxut k3ulxNiAy25pS4Q== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-ORIG-GUID: tO3XdtrDIf1MOgsYv_6cvbePm1mevEmh X-Authority-Analysis: v=2.4 cv=Nr3cssdJ c=1 sm=1 tr=0 ts=69c54032 cx=c_pps a=P2rfLEam3zuxRRdjJWA2cw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=VwQbUJbxAAAA:8 a=pGLkceISAAAA:8 a=bC-a23v3AAAA:8 a=EUspDBNiAAAA:8 a=tBb2bbeoAAAA:8 a=BPk_T5_A67p-JLsZVCIA:9 a=QEXdDO2ut3YA:10 a=ODZdjJIeia2B_SHc_B0f:22 a=FO4_E8m0qiDe52t0p3_H:22 a=Oj-tNtZlA1e06AYgeCfH:22 X-Proofpoint-GUID: tO3XdtrDIf1MOgsYv_6cvbePm1mevEmh X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzI2MDEwMCBTYWx0ZWRfXwIA4R6D2RIdf Zf0eBOgpXNhy50JMq1+0CXfcylDdABAXg7Gam2JgVNjUAeAHAar7SOIMI8zZW4UWFGTOTd3VRUQ IM1wykR7Ny8ydMJUrZ3fdbuyIuK7Xy31f+22zJq6vmb1rcu1uf3U6CiycS8BOEyqgeiLKAGcyee 7CwoTn94dYqFn6LSV6JJmzDWkyhA2f4JJXsjv3hwdMeen8Cjiqz4yheQVSZ/dmAqBa20yoIheQB 48x9dp+ajZo5fZyR/s6OOYP8TsPG+Gn/n29eF69+7MIqNiHT1lElcUfICtnyJKEeBxqjJnTXwyi QNcpdsBR7yfZnGJR4M8eaIQR+h4Xp9higrb81cnfGcq+EMwvGAEDf8/+H2BfQxitAgcbL4vuJNl iqKoaSBvnytw298DJbWYm5oJL4cU/bDimsJG28yMEvSaUWrUafabP3/aqxpaKmfWscgmXSc3YZg Zr9kkUfu8qC1G+C0aOA== 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-26_03,2026-03-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 suspectscore=0 impostorscore=0 bulkscore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603260100 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: Linus Walleij --- 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..cc36f1d1f3edb2b5c8609ab5ba7= 2b23e6db480bd 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 long lflags; - const char *name; + size_t num_hogs; 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 (!ret && (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 (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: 880e76d276421113e3017d1b950bf932dc4e3ce3 change-id: 20260325-gpio-hogs-multiple-1718d38c1f5b Best regards, --=20 Bartosz Golaszewski