From nobody Mon Feb 9 09:32:52 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 54BB12264DC for ; Mon, 22 Dec 2025 10:01:42 +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=1766397703; cv=none; b=YMuVVV4NnyOj/i2aiCOZMW/c+XfeqQ7+y+Lol9G7Q70FlGD0K8lo1YF5vKKFJ0rLrDE8PKD4XCycsrmlyAmTtNQAjbwZXcEngrbSWQAZqSj9b31prEUJGlcq/c1/FCuHvJq0h/45kyFzfb8sY4QUO9kYsu2cCLZROT5NDqLeaiU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766397703; c=relaxed/simple; bh=OqHedWdRA9ym7zNDd+PhhxDu2MrS1xv4QTzYUsBJBgo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mes4UvLFqz1ilKXzfjmwwixAdWiM/fhZMADRHW5RjewCsTDREz0Zb/o2u0YZWtfrRQ1nrcnRaOi6veS819n5qHwlzmVEEh2ZQMil2TcUbc2F8+kPn9Dj0PS65Nr5v1HFythDLJlQeD+y0+Re9ko8CB3o3uZnjuQlvnNamLpGoYE= 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=dn4Mv15F; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=H54qT3jg; 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="dn4Mv15F"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="H54qT3jg" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BM8ZNax3965513 for ; Mon, 22 Dec 2025 10:01:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ivclPZ9+7tXkAG77d2CX6IaNMBqBxCJ5TBU5QlnU1vg=; b=dn4Mv15FfJIEPnpp TL5IiWPSvk9sp+DG+DSGazlkJtw5XMouMm85YrwAIBBIIbpU3KAM5Tly4G9j8mTq lDMmNLi2SA51hueGhaSR8WumQenWUHm6bJSsF9e+W4hJDtKen90OY9x61bwWd3qI Kt9RhFo5X5ByDVSSWCshdvAvELoG37jBsjOD1TLZymPgibca/+4eW9HHB/eMeYUA GTNM7mIbUQjACIq9dZZ0H9kT90o5YFs04+YNg4Hja7luYbigDR6wCqsDXNkjjSjK 2scgR996ePzskB83+e8ijRP15s8d7TWZVS7CvFqx84VoMjFIYn/8SvQ+KagiWIjk 3ww0Bg== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b5mry4hvs-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 22 Dec 2025 10:01:41 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-4ee3dfe072dso99874421cf.2 for ; Mon, 22 Dec 2025 02:01:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766397700; x=1767002500; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ivclPZ9+7tXkAG77d2CX6IaNMBqBxCJ5TBU5QlnU1vg=; b=H54qT3jge0j7t2ZjQSvunaqzFe347Ds6aVB346tE3klcsUFnHtkE5KpgvZYIESExMk l1UWyluK6Ayox4kkXenikNHpaf+xTqJ4gBmWXJXk0TarqTOGvQ6OTJlNi+m4BWITtGwC C/nKb80m7oEpt7OIfnAHQhBMPYpkVqMY8oxLHNmyBTvsBhPPq3oLrKEEQ/7THcMsyW9+ BY0ZJowKbQ4mMAj30D2L16uKPuF+2meBLM4j7Spq+SBQ+Kcn6ezvG22rwKxgxVwsEsn4 avvr2hGu/r9BhN65fcOqASbR+DNUuZhmRIMhp4e1UxB3JQlj7MqdoByEa+vIHaDS2fTq vcIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766397700; x=1767002500; h=cc:to:in-reply-to:references: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=ivclPZ9+7tXkAG77d2CX6IaNMBqBxCJ5TBU5QlnU1vg=; b=WE3wKlRvtjd7MyRGjMGvkcrPFZkqUNbT3Gr2HP2aJkWZ1YzpRqnxElix2lpLTEZow6 Jhe8Z3kWrxQIuCSL7NXX4KXz5a+LD6OpWwJoRdjt0FgMSQlRNgBtjpmndCtQE63yO3wS agVbONv7R3kxW1ZS7tYqqeGzzBsWCbx0URBg4oMokcE7rtRcusXDFtic0hPl4/toZOt6 Mcdaz+C+jyFftAmnoT0MndjVpHk+LiTHQY3+iyb7pxzNvGlexguuVzzNH5NOxu6FRUZS Bz7I8OqBZyxMbaleipCIRpOV1//sK4AJAmAaU2hF5NiU3G6Rc/qzNjcgz29MR/aG8D5z OGbA== X-Forwarded-Encrypted: i=1; AJvYcCV7FUcB4Vtfx/kJQCn+jortIck0k4L2delM5KfhoTo8aGoBvLECxow+IhLREgFcmBeogSLsvEZzYvydzVs=@vger.kernel.org X-Gm-Message-State: AOJu0YwYuUjUOSYFV5xQqfCSxQk+CxraAZgq23yY06cVuTBZAw33cQpZ uJWK6NainalGepVri+Q4oIrPUTmvMbRiDq1+9tQPDBWIxjvYD1uTGoqMs/sJPNe0gzG5WZ0dTqR vRf7DCruTEY1YeHyqrpmU/60EdywD2ZIvePIgNMQU9NugeurStRzcSElWv1evB90z3J6kHxwtE+ w= X-Gm-Gg: AY/fxX6kaJEu3rOYBsv56JKjbWpOkUbc9Pr+zcaULVIom2w/DY7oGxvP4RM+7KymeOp bZ4cLhIRhX+Aa0hkPyHt0o5kIT41NiZnnf7XVYmd3pgH7MyZ35WamkpvkgRKq4fxovlbqwD0J4z ZvNy7lysO1L0Ptsv+NNq1lrlXiW/ZWzsl3tspOtoX9WGEIS1ZXcGQ5OhX7O5QNbf/ppOMYTSOdk M2jcM9/M1ukGGIguTgR7fSYX5QVAeJFVkU7kK0R/0Yj13wp8quROep/B9kr9tSd1AiS9n4A7anL rlyUBMxIRlOm5PRD7QMsyYFw+n+3PRwKXnh9posILPXJ/NPhppKb4ELv8/3BUBCGt3HeIKd2q6S 3bh7WiaPQ+AknNf7NlbWp8n+rE59pXJKRdvJMDcXc X-Received: by 2002:a05:622a:1f8e:b0:4f3:5816:bd8d with SMTP id d75a77b69052e-4f4abd97d0dmr156561911cf.62.1766397700475; Mon, 22 Dec 2025 02:01:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IG6gzZ5mv/nT7hYMmIxkUp6imgXoYjQLzF9NQklV2tTdBBM5dgkY5uuW4BC6tI8vS0X6Djsrg== X-Received: by 2002:a05:622a:1f8e:b0:4f3:5816:bd8d with SMTP id d75a77b69052e-4f4abd97d0dmr156561301cf.62.1766397699880; Mon, 22 Dec 2025 02:01:39 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:bd86:6812:7564:9961]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-432613f7e6esm8174665f8f.21.2025.12.22.02.01.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Dec 2025 02:01:39 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 22 Dec 2025 11:01:26 +0100 Subject: [PATCH 1/3] gpiolib: allow multiple lookup tables per consumer 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: <20251222-gpio-shared-reset-gpio-proxy-v1-1-8d4bba7d8c14@oss.qualcomm.com> References: <20251222-gpio-shared-reset-gpio-proxy-v1-0-8d4bba7d8c14@oss.qualcomm.com> In-Reply-To: <20251222-gpio-shared-reset-gpio-proxy-v1-0-8d4bba7d8c14@oss.qualcomm.com> To: Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Linus Walleij , Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4564; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=OqHedWdRA9ym7zNDd+PhhxDu2MrS1xv4QTzYUsBJBgo=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpSRb9DI/jlNEdf3qrEDnkgENS8HBVq9+pfIqax O+kiD6PecaJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaUkW/QAKCRAFnS7L/zaE w3ZjEACImO1/KvFJKGi0BYWWKzyzNVmSLTuATe0rWlPPmoHL9YCY7ikB0ZV/MofEcIJvGHtJRJc MoxbiGAc2rdOsBWVfjju1tKyccWg0FVqIjIZnspa1wc89NxwNvw7LFaWNXnsyr7UvlKVnpJO8kc tqJLkb9mx9Ly0kWGr6CiKMEmdPqHHea47cdZSXRDMk4fjfb6LYNSfS6pH9jx4rvodIafQJ1WRlA NOGmNsKoJIJuWLszaOnYy0dL/IgOJIo/5eYBrkiMK4IlPAU+F+OcpP05q1OqOkq70W57hQxfk7J 8zVg85agIwBjs9KPITZQKLYvPy+CcJ9DGrCwNTKcyRRtFqBXeW6h3AMZQ2hJx3MYrczZZRYNoLV yLRd82rz/ps95RU6kBdp6HSRImAAMDCulYvDgaqZxNGeG5xDlA4HIKh9dr0xmAPEx8LQQKhY+mX KGSaNQKFHS4qAvKonBXLlvoW6t0oZnxwNjxfIRzMLWKrEZzU9s8z5Jy7r3bxxw1egfxk2aCpl3E dS2w/vNBrLFQrFG35hcDQZKVCTujD+XIbcsXi+juexNPKrebGVd8Qlnr55ugAEQpbXGckOft9Rq Ht2rtGMTdccQiA5NAdieRFSsKxnFUH+rU+PGE/gwoopnIfIJreBWmYTdHDe5uOGRaYba7srANPU haJgHpgNWlamtUg== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Authority-Analysis: v=2.4 cv=cbbfb3DM c=1 sm=1 tr=0 ts=69491705 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=sI4iXw2iqjXbcpY1YxEA:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjIyMDA5MSBTYWx0ZWRfX/MGbx342Dn5K Y79sP7wUkPOtRb1oTenXJprLNaBaioUm0w2WyMFlB1/s3nfehwGClxUnDBK8oPeOYP9Sd20t/sa MaTRQ59lzxoBM7B/NzytG5IY57M2vZXn7Ee5WWFb4A0d/6vjR6Ekfpvzl/lGd9BmhemAbXf7EJs cWtpaQWxV4Huyn0Nz6drZVDXnUJodLczvUWKg25ZJ01KY4hlDEi15CEWNrL1wzA0tNkFxmqNUEe nfbd9OoBUZZnMR83GqnSSHZcMiGpbS+4VWvMcLqeo18FVncIJ+UHCjwXTtAl5O+O/UEnbForpI/ R2DEItdbK3HnAYXB3YmvHxW6JAnkFaaC9RvlpRi6irB1CWOO3HCf5eKJsSmaLeXyr4h4AmXyGVx 5iJappZ97C1p0N6ixDyFHsj2CYuhft71C3uWmTUXgjM/bxsP8zjXL5jVx5fZ5u1cc/BCbVrvabB z4vLziCHuLpevdnOvhQ== X-Proofpoint-GUID: ANiVdu8_zs_88mbj-J4rp7iT7-ffKMk_ X-Proofpoint-ORIG-GUID: ANiVdu8_zs_88mbj-J4rp7iT7-ffKMk_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-21_05,2025-12-19_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 phishscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 suspectscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512220091 The GPIO machine lookup mechanism dates back to old ARM board files where lookup tables would all be defined in a single place. Since then, lookup tables have also been used to address various DT and ACPI quirks like missing GPIOs and - as of recently - setting up shared GPIO proxy devices. The lookup itself stops when we find the first matching table for a consumer and - if it doesn't contain the right entry - the lookup fails. Since the tables can now be defined in multiple places and we can't know how many there are, effectively limiting a consumer to only a single lookup table is no longer viable. Rework the code to always look through all tables matching the consumer. Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpiolib.c | 91 +++++++++++++++++++++++++++++++---------------= ---- 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 91e0c384f34ae5c0ed61ccd3a978685d4f72e867..6d583b3b07bb5c3e5886ced53de= ca7cd02460890 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4508,45 +4508,41 @@ void gpiod_remove_hogs(struct gpiod_hog *hogs) } EXPORT_SYMBOL_GPL(gpiod_remove_hogs); =20 -static struct gpiod_lookup_table *gpiod_find_lookup_table(struct device *d= ev) +static bool gpiod_match_lookup_table(struct device *dev, + const struct gpiod_lookup_table *table) { const char *dev_id =3D dev ? dev_name(dev) : NULL; - struct gpiod_lookup_table *table; =20 - list_for_each_entry(table, &gpio_lookup_list, list) { - if (table->dev_id && dev_id) { - /* - * Valid strings on both ends, must be identical to have - * a match - */ - if (!strcmp(table->dev_id, dev_id)) - return table; - } else { - /* - * One of the pointers is NULL, so both must be to have - * a match - */ - if (dev_id =3D=3D table->dev_id) - return table; - } + lockdep_assert_held(&gpio_lookup_lock); + + if (table->dev_id && dev_id) { + /* + * Valid strings on both ends, must be identical to have + * a match + */ + if (!strcmp(table->dev_id, dev_id)) + return true; + } else { + /* + * One of the pointers is NULL, so both must be to have + * a match + */ + if (dev_id =3D=3D table->dev_id) + return true; } =20 - return NULL; + return false; } =20 -static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, - unsigned int idx, unsigned long *flags) +static struct gpio_desc *gpio_desc_table_match(struct device *dev, const c= har *con_id, + unsigned int idx, unsigned long *flags, + struct gpiod_lookup_table *table) { - struct gpio_desc *desc =3D ERR_PTR(-ENOENT); - struct gpiod_lookup_table *table; + struct gpio_desc *desc; struct gpiod_lookup *p; struct gpio_chip *gc; =20 - guard(mutex)(&gpio_lookup_lock); - - table =3D gpiod_find_lookup_table(dev); - if (!table) - return desc; + lockdep_assert_held(&gpio_lookup_lock); =20 for (p =3D &table->table[0]; p->key; p++) { /* idx must always match exactly */ @@ -4600,6 +4596,29 @@ static struct gpio_desc *gpiod_find(struct device *d= ev, const char *con_id, return desc; } =20 + return NULL; +} + +static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, + unsigned int idx, unsigned long *flags) +{ + struct gpio_desc *desc =3D ERR_PTR(-ENOENT); + struct gpiod_lookup_table *table; + + guard(mutex)(&gpio_lookup_lock); + + list_for_each_entry(table, &gpio_lookup_list, list) { + if (!gpiod_match_lookup_table(dev, table)) + continue; + + desc =3D gpio_desc_table_match(dev, con_id, idx, flags, table); + if (!desc) + continue; + + /* On IS_ERR() or match. */ + return desc; + } + return desc; } =20 @@ -4610,14 +4629,16 @@ static int platform_gpio_count(struct device *dev, = const char *con_id) unsigned int count =3D 0; =20 scoped_guard(mutex, &gpio_lookup_lock) { - table =3D gpiod_find_lookup_table(dev); - if (!table) - return -ENOENT; + list_for_each_entry(table, &gpio_lookup_list, list) { + if (!gpiod_match_lookup_table(dev, table)) + continue; =20 - for (p =3D &table->table[0]; p->key; p++) { - if ((con_id && p->con_id && !strcmp(con_id, p->con_id)) || - (!con_id && !p->con_id)) - count++; + for (p =3D &table->table[0]; p->key; p++) { + if ((con_id && p->con_id && + !strcmp(con_id, p->con_id)) || + (!con_id && !p->con_id)) + count++; + } } } =20 --=20 2.47.3