From nobody Sun Feb 8 05:37:00 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 From nobody Sun Feb 8 05:37:00 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 38782311964 for ; Mon, 22 Dec 2025 10:01:44 +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=1766397706; cv=none; b=eqZGdJ6D2sGGkMicVCirCznDR8LNBF928zNfX7awpl/9cnPwUHXoJap3bskEItdpl64jvWDgsUg1qW96ee5MLI8FzumbEx55Az/O2vXJam48Q772thNWVkQmdg2kyJpF9NASzVqYFWmQ11Y/KcTOTQJlnd4tVM/FBCiQBQiiuwM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766397706; c=relaxed/simple; bh=L27WLTZVcxDySo0b2NW2P2T7jkbfMdif5zF3kG4wOsc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bHnefYd/XogUNqbAinNYAKDRbje+wX6EYJhHaSZPGW+7vempqTaoPkJo5MDbWxMOpmM311t413rnrgE5nwny234EoAw2SNST39hCPOyjZBEdmWdxP+or7q9do4IXrJPZR+UFeyKeBmKXraV/Ks8VjXC9+kygKZtJTgL98du+hkA= 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=ZslxVUHS; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=iqv7YEBa; 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="ZslxVUHS"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="iqv7YEBa" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BM632qS3106883 for ; Mon, 22 Dec 2025 10:01:43 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= 8qQ6b+qsM/QmOJkj60dMJt5f25gnShd+OIyr9ntovX4=; b=ZslxVUHSZj/c9qO9 PVDGjWKJVtkM80YA52leUzCegEg4eT+Ljoe+D+Bx1McHn8S2aZ8WrMG6iZAapiUD lU4cPXmLXfk0h7z6Tk3Hym1hIPCCARxR+c6ZHiMub2LD8l0rii3l7bQt49SlUGw+ fM4neKedLKzuZSR9s0mIQSbzPf2uKqzenfsqqnGH2M4cfh4oRz69MqqFLHXbxDt9 23+3xoiXzsfRCnETb4dqh87enIHm6KbJRuNvl+CPoOsWlK5uKj/hG93220cxxC5P WImag1GumDojCS5u/+L0ZrwV96pOomrTNTRpPmu7aRp7bngbs8PYwheFWGFBbm+9 AppmrA== 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 4b5mvfmjq3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 22 Dec 2025 10:01:43 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-4f4ab58098eso80547791cf.1 for ; Mon, 22 Dec 2025 02:01:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766397702; x=1767002502; 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=8qQ6b+qsM/QmOJkj60dMJt5f25gnShd+OIyr9ntovX4=; b=iqv7YEBa0xCPdGhZfR1LZfxAGzBOpcjENm94sG2Rt1HMVHbNigg4bk38IrerEJQLOd rF3n0mSwS1ZpMNYwYprrmKTj7aYAAccmvMLDeGeCaNoAXSng79CtVohONWJpNKda7qRA v5A4QhTZoUBKt9c6yGG0ndhWBRCkMJ+5Vy6wmU5X0zmgStTIOzx1aOCfnEvbUZwIWVET 3W7fknpDQpUOoB1xre5iAXYOFUC3iLDUrG7l2tFlX18U7Q8vsgbjFZaupm+btv0C55eQ 4NtA6/iI+KwTWO2aKLtsWvdqQdkwnYRNm6GNPixLAWc/Trl9B3DgA0WyEI9+7h0voSe6 2ypQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766397702; x=1767002502; 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=8qQ6b+qsM/QmOJkj60dMJt5f25gnShd+OIyr9ntovX4=; b=Ns/ba/SPdpqVszMgxKbo2o07Q2i45aBV8e9XkwsN/3UPvkoUkvargjVP6a1j1tJrQb B9ILc7ChQSRPUydkzhqPqPf23JbqMUac0lBzpROirh3p7dkd3GVDIIWC73rI+4iwwG7g bLx/xqHL7CGn2PiTwWFsSc0msbG5UhPXbvx/dj6oLqlesdtqGXT124mtTQbTbnWCluCC ACwqqO4Mci189keIXRzXtXIdf5tIazFe8U/oIx6hJDlWYPlGZStixSxgpBl98KnTvgtS DhhZCm7LHosGuhUiJ2WEtUghbBzObm/pXsZQQe1GWG4PEEKCjdEqe7CTBY9ACmpzsh6E 112A== X-Forwarded-Encrypted: i=1; AJvYcCVT2vI6d+ft8G5pWN1aB3fAGOJLqTpPs1uQPVYhgDtH2e7Kop6pf5js1cvD6pCp3pvd+ZLNxwEE9CcrCXg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywsbzf+7XMJpqJFnOyO3psLSGiskBD/8QUfmYd0BJw986FSqMel NKEKafr7zVorMj0rpyDWkYed7CmVIZ3YdNgIcJXV2IfhmsT4euensP5ahzRcY2WfLQV2boL0JVN kuWNbPQ7G3viJchggqccd2ipmdL2sNNmqvjjV6fnc3Zd9TC0XLeEbmffpli8zY/XkvDGmL0CGit M= X-Gm-Gg: AY/fxX4NuWmoFySSttdlodsyXnVwuXyOK6EuGrEshGR1Vw4jaC8H7fqqgZb8y4Cf6vu V01/5FCJLxdwTI+DB92/VeGQgo9bGPy9tAv4OgleEL5jZcAm0Ev9XLIrZNS3W2yGXQgVgzHc2Z+ cvO51NKliP1p8AJVeYO+WjMauO1FSnI5u+GwweDSFOUcy75lPo2yKxzFwj/WvHoVBGiX+wsI+q8 ztEGSBguljFEQDUbbd5MBQcZ53N0PjfeeOeTntf6+bvxaWa7IDyS8YPiJV1YJY6AjW2Qjp9iDuE EVOStXshgcXxQxw9sFa5JDURoP32bX+kYvBwoy4ZU7R/vcqDevUr30jKOfI1A9VrhwC6v+eQ28m hHtwgXAVptbTQy6nFYmaOXYJ/IKS+RmjO65mkU8YY X-Received: by 2002:a05:622a:4183:b0:4f1:b3cc:2cec with SMTP id d75a77b69052e-4f4abd756e7mr155738491cf.52.1766397702000; Mon, 22 Dec 2025 02:01:42 -0800 (PST) X-Google-Smtp-Source: AGHT+IH/bZBEaOVW4VHMf7zDTHeEKgEociCIx+WeaLncnMJ1QEoIpoooG+7dH6f5NVOX56v+L7Uslw== X-Received: by 2002:a05:622a:4183:b0:4f1:b3cc:2cec with SMTP id d75a77b69052e-4f4abd756e7mr155737961cf.52.1766397701399; Mon, 22 Dec 2025 02:01:41 -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.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Dec 2025 02:01:40 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 22 Dec 2025 11:01:27 +0100 Subject: [PATCH 2/3] gpio: shared: verify con_id when adding proxy lookup 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-2-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=3203; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=L27WLTZVcxDySo0b2NW2P2T7jkbfMdif5zF3kG4wOsc=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpSRb+dOQL3UpjkCwQ0XPxXcu4Kl7MkZwENnpyn dLMN8kRMbyJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaUkW/gAKCRAFnS7L/zaE wzW/EACayoSpEHAfpmWSGlU5tjHpp13nUZI0i4WuERfr5LVZM6YvEZQHVW5vuzoGF5hfqaW4blk AVYfigIdGavjubD2YurqvY2r424PzbhykTLqRowLcietcGPEXcIqm59jWfw+oZzDc+bFJCcdr0o mbxA9WCH0xJMM3lBON3QF19353wF65U+mG5hx0CKaWVS3Z2GMLgWFL7ogmwSfktvkFr+MybJKHY rPvt6UGzArpBZEz6SpBTyGZa6OXwlg3Pdy7OBURkn+BFFDDPXEOsPOoaUb5vvZdb1qQdQjIOWgi 6DmdgPV9x0sZohb6m/xwfoGK6Kdv3UWDmjqrRP4jymM8r6vFiJO020NLanWgkJAIO1KeapAL5Bf zbwpeYDDkISPeIYbi4vdm9ziCQ7PbubOqvULZrz60LgPADxI4ZIvscmIVHbX9iW41HoL9UbKG8w ivMNwJJfKEO7exEaPCCL1IbFpjXF9/f4SA3oozdzFu3tsbHZ+sAh11erzuImpBTXQgje/IcWEMM K+W223PFY/8pwrwi+sFVSJqE2qAXQZPIZlM0XKNnp6+pSVuNmv1vDd/t+4w+5xfZp2F9II3eoF8 9xr46rASfs19t93JNVp5AC2lq/Efs50RqgSFFdRutklo0c+LVtHkMv4eYCFoeaAFSPuC2FKYUUm +C03PuWD6kY96Jw== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Authority-Analysis: v=2.4 cv=H8rWAuYi c=1 sm=1 tr=0 ts=69491707 cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=dxZR3yApE9zKbSvtV-kA:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-ORIG-GUID: UFoICrbJyH5qf0rq4Tq3mj44bBZAUa2d X-Proofpoint-GUID: UFoICrbJyH5qf0rq4Tq3mj44bBZAUa2d X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjIyMDA5MSBTYWx0ZWRfX30GpW+K5pd7J PxflQyqVRFuM8XKGw0QZbWHPRFP57rq5xT5n8mI8lBhsQACW4/1rb87jnIvcX53AgyyqhLXvhO8 cIX82WqT9stYAV2XLdpbR1FoTMmKwiL7fZi8UFnrrEJxkKXEtQfcQfZ+utUA2QBlsx6RQ1hUVlG VyweXQudDsg3S7BCOLQC8pkYYr897s1Hl4z2LTBeWTHLpSrJ39nNcFG38sln/iBGArL9MSq+jtg cj4nERMB46YZgV4P5spPxEV4f+zqhODYX4C2TOcV+Ypx5MKGRFG6L/pAzTZVlqOQy6zEzH2XiGE 6+8U9zbTe9B8zMSxt2k2EdWYXeqbWQjlyOUqmck/tAY12yI1Ew8rqDn8uKLYQbeR8POHCE7Wzwo J9HJ+mPqbvpABdfWBwf47Zlt7gDyBtlVc2b69Ck0tA2NnIPwo5UT1BOt4G+xs9gKexKwttL/BWm YdQy6NvsVJKipLG0c7A== 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 impostorscore=0 bulkscore=0 spamscore=0 adultscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512220091 When matching the firmware node with the potential consumer, we currently omit the con_id string. This can lead to false positives in the unlikely case of the consumer having been assigned more than one shared GPIO. Check the connector ID before proceeding. Fixes: a060b8c511ab ("gpiolib: implement low-level, shared GPIO support") Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpiolib-shared.c | 7 ++++++- drivers/gpio/gpiolib-shared.h | 4 +++- drivers/gpio/gpiolib.c | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/gpio/gpiolib-shared.c b/drivers/gpio/gpiolib-shared.c index ba4b718d40a087608fc06f59d242932df1d117e9..f589109590c7c6bc9c0c1828ea1= 5ab9003846523 100644 --- a/drivers/gpio/gpiolib-shared.c +++ b/drivers/gpio/gpiolib-shared.c @@ -365,7 +365,8 @@ static bool gpio_shared_dev_is_reset_gpio(struct device= *consumer, } #endif /* CONFIG_RESET_GPIO */ =20 -int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lf= lags) +int gpio_shared_add_proxy_lookup(struct device *consumer, const char *con_= id, + unsigned long lflags) { const char *dev_id =3D dev_name(consumer); struct gpio_shared_entry *entry; @@ -384,6 +385,10 @@ int gpio_shared_add_proxy_lookup(struct device *consum= er, unsigned long lflags) =20 guard(mutex)(&ref->lock); =20 + if ((!con_id && ref->con_id) || (con_id && !ref->con_id) || + (con_id && ref->con_id && strcmp(con_id, ref->con_id) !=3D 0)) + continue; + /* We've already done that on a previous request. */ if (ref->lookup) return 0; diff --git a/drivers/gpio/gpiolib-shared.h b/drivers/gpio/gpiolib-shared.h index 667dbdff3585066b7cbe2ebe476725fe7d683d84..40568ef7364ccbf08b7f583e279= a7d5b572af477 100644 --- a/drivers/gpio/gpiolib-shared.h +++ b/drivers/gpio/gpiolib-shared.h @@ -16,7 +16,8 @@ struct device; =20 int gpio_device_setup_shared(struct gpio_device *gdev); void gpio_device_teardown_shared(struct gpio_device *gdev); -int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lf= lags); +int gpio_shared_add_proxy_lookup(struct device *consumer, const char *con_= id, + unsigned long lflags); =20 #else =20 @@ -28,6 +29,7 @@ static inline int gpio_device_setup_shared(struct gpio_de= vice *gdev) static inline void gpio_device_teardown_shared(struct gpio_device *gdev) {= } =20 static inline int gpio_shared_add_proxy_lookup(struct device *consumer, + const char *con_id, unsigned long lflags) { return 0; diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 6d583b3b07bb5c3e5886ced53deca7cd02460890..9ccfb7af67cca61207e8479842b= 78942a22cb919 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4717,7 +4717,8 @@ struct gpio_desc *gpiod_find_and_request(struct devic= e *consumer, * lookup table for the proxy device as previously * we only knew the consumer's fwnode. */ - ret =3D gpio_shared_add_proxy_lookup(consumer, lookupflags); + ret =3D gpio_shared_add_proxy_lookup(consumer, con_id, + lookupflags); if (ret) return ERR_PTR(ret); =20 --=20 2.47.3 From nobody Sun Feb 8 05:37:00 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 DD22130EF7C for ; Mon, 22 Dec 2025 10:01:45 +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=1766397707; cv=none; b=M5Y2A95bWY7RNPshRuWWPNeWMvzcyybzO4+Isq4WxH42RRIBt0Pm3iN6RPPRXilQe0Tya5+QOFNS3FqD/IriN+tJwY5c7uPXPF4v+d9ISRB60BOfiaFrM7t7jYBbmi7SRjncTUxi9qZ+fz9W0jFX80Auxt2FlHxIXBM1KrJVpgY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766397707; c=relaxed/simple; bh=zSx8WpjDsRV858h7FCxvPJSyX6no5aqsASmnYiLXZ4E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h7hr8kpmFl3jKWLnhUPQzLcsdUNwzPQWX3x23WxJqZNH5UkFAGU3XF2Y7p205MW6Vmtp6OzVhIAoDDFj9uK5GmA9eDoMyVtUmpxslk3our8UmBtlpoPpqA2uf0MKucB13LoBqvamign3vcVaf54decdrGf6AyEvYdSWwsTvElMc= 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=o2+1r3KN; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dHpO17W1; 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="o2+1r3KN"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dHpO17W1" 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 5BM7wwa14140102 for ; Mon, 22 Dec 2025 10:01:45 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= deKGZwnEGuy6HeY4z4IFpGSqx9YafWG1O1S8CaouEC8=; b=o2+1r3KNxWx30otF X7yU//m8m/kiMK+ZO0+LsMTBp/v9trTSbxI15ZJQAhs77NbrxoLL9HrAlmEf8DjO p4iZGa0NQlJaOPE3x0qi2G4fLPzORJdphVwoR7l4AcnSa/45fa6IEEVnNuWjn5ZS J/wC+l0Ya6EzbHZZ+45Ixc18QAjA/ggEVk4FBfgMwr0Yp0DUDzSvqx2CbYcxEG9V 0GXpizD15f/zLB0Lo0Dr2ZJoSxXxNflImbwuNI0NvWHOCloBJfp1jNEZJ3SSYpKG QOcPtVB5+GHgBgfd7zTFEQUWlNAtpxWKyBOp2PrAX+WQiVJ9lde0SJPnn/kyeD+W 6wpIZQ== 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 4b5mrackcb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 22 Dec 2025 10:01:44 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-4f1dea13d34so82462011cf.1 for ; Mon, 22 Dec 2025 02:01:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766397704; x=1767002504; 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=deKGZwnEGuy6HeY4z4IFpGSqx9YafWG1O1S8CaouEC8=; b=dHpO17W1ysBOA+ntVXb73pGwMHFOBqXVSJVbQlYvoaHtJhMutxlL3sRvMQG2tZuiDa ic9OeHychq834SX15+H8uXWXfvnMSx0Epbf/vZlBlwQSa4r8zQSRiIG7cXxNkNESDVf+ raYiFVRw+z83eGKLLi1xpxHYyJ6eI7yuHWKvdVMOfgdr2cnAd6OtWs9JY21pGJQ7FU+F FQ7Du2QNdwDy1zLcMLdpJAXKY96p46uvkqsYQcc5tClurq7J2y7ceyt+DgF1MTdcvoLM 9envaiUoDQ0TMclhIHZhtaFBPn+97mGbhZVdT9kqtP3p+D6S6pWMhnm/r7l6pDTKeQZT ELmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766397704; x=1767002504; 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=deKGZwnEGuy6HeY4z4IFpGSqx9YafWG1O1S8CaouEC8=; b=Z5iUjNjm9pQyQxFR7poKlolV0yKlhSQsq0dDZtTgP85Z3JrKJeXmWDoiza0Nlk3BO/ NMJBYj0ztYkd3hd/x5mYpShJxR79vfEJ8QpUCz6BOb8fNt6lBa5stKfR4YspKJeoPrQQ FD5p7nkcw6rg4QMI6m4dBZISOX2z424UtbtktKsmMapmACfi1O0vCQ22JFN7xIK6SKNm 2XeJY13C2Eijpx/0Mmbucsd1vJvjGaT3d4rd9Be0U4KOv61PNUZbkhBM02iJTjNcgwX6 XtNgvwb6sdny2azFVPTRMwaQgkqQ3f6cVHirTF4BXLYXXJZyjM3z/9MJw2WT8rbfx+pC w2ow== X-Forwarded-Encrypted: i=1; AJvYcCWRu1mvAOQZDPxjt9g94ZTlG8pCQFdjJ93yJ99MWQlpu+ATa7nB4ZvV0R2dxyFeMXQ4QwCal3OdyZLeNDo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+N0S3cBIN6bsCVpc4pNZrZ/TCuhty/jh9VKlj40rqnbQSv4Lv ikbANgz1PCtL+NJ8Vypu54Ti7bf5w7h3FRMwySLUpeYPmFt7YOgcKl5R1P2z6H/qdoRfl3M+OXR W9LeSI49CtBA710dChFwUf8r33Ouv2J9ByM3XsIjg662xaVlWIuBAivBt53Q+AYlm73eLDykrFX 4= X-Gm-Gg: AY/fxX7wUVLeSX3AkX5jqJfC3hfUF0L6e7IhCSkP3ZQoaqUZUX0FAf9O4itjIjdetkH eaI82ODafe/J/NjTLtQp0rJFVSfpChLW3rVaZfKuQLY1Rx2ZfyNNaR1pqSIq8oTdBTvFQiADMSz XmCYtZpytK6vVB59yWKo5EgWu2ltTaN2qerR/2fQZW8AnBkZhk48/PCps4myYqBjm7JdtM1B/1I 1+tIhRjv6uCLiEtxrTfxYosuzyTZ7y6NfQhhyNqgjXOQnsOFbDIX5gshI2qTfr3IXkf9IWpd8mg ZEVsFGPh2GkVH9LgqWk9AQBv3kubSXSV55T33IssqnHwURrT9sEO/vA/kWS3yvrzZwlj04/ArXj hQbXCOaV5HHYRsqU3kfRNC2iNVzSsU/sWnt6erqnG X-Received: by 2002:ac8:5058:0:b0:4ed:43fe:f51e with SMTP id d75a77b69052e-4f4d61fb029mr1325061cf.39.1766397703609; Mon, 22 Dec 2025 02:01:43 -0800 (PST) X-Google-Smtp-Source: AGHT+IEAVYe55WuPnaOv9H+zNnX/8uHgI8UllPMU19v/u5GZ88+3ZBE1C2wvqmM1mO1AuVCVjOZMXA== X-Received: by 2002:ac8:5058:0:b0:4ed:43fe:f51e with SMTP id d75a77b69052e-4f4d61fb029mr1324571cf.39.1766397702953; Mon, 22 Dec 2025 02:01:42 -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.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Dec 2025 02:01:42 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 22 Dec 2025 11:01:28 +0100 Subject: [PATCH 3/3] gpio: shared: allow sharing a reset-gpios pin between reset-gpio and gpiolib 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-3-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=10280; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=zSx8WpjDsRV858h7FCxvPJSyX6no5aqsASmnYiLXZ4E=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpSRcAUDr7lOx6aSj3Iv71LNCP+QMj9/xGO1WdH AlR4KV+x8SJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaUkXAAAKCRAFnS7L/zaE w0i1D/kBMZbEbfwrrKwjsjWMCI5mlD0UFGqCeS+THAXX9l03uxRunvZ+1+v+n3bBtILy0soZcue FtaQVnhqIxNPMxkUWzznsta+ii22HHEUjSF6s9XsPROpdP+vZdOWOZiCg3f2ItJSbsD9IlT3XyS rGAZh9Ov1k1IhbNRg6IocVjN5QrgAzXvbm8h3jq6Bo3bYFoGQGVlkfgTYQmgG95C0erOkMKFupo zJAtJzfX85cMdFPrzG0o+D6GBVoReNUQQ2b0NiMO0W0aPtZb++boWsugCkrVZ8sfk3QTqwWZDoR AjnqpVTNxgC2dt11cV8aDG5LxLYT4ge32qpjR3UC/nm6ecgeGUdeyz+KO+s0s1fOzljUhB1cjLZ Ey6xmIwz9tHoKW9skRfuLw1zenps3FV/5eChBABzU6h9CCcMFcMbRpKIr22E+2WHJMCWsiqASEi ec3HNKpgcPeRLd7f4pkLGbzfPJYJgay82z2EmPPalMXy0FtKcxJ25R37+5Qji0yPcQIId5R5q+H 1oVRueYJy5LPN4R05Ff186NYCMpDv8Ue46aoD+cIjPegsvI0QtSnE9t4hYfFVwJSWrQnvKim3tb a86vPwkRF1D2xzCtDeSUq57RFvpeechJUb+Qm34DTZwGhzbto/3Rpp+ozaSiHX8Z52zvlNIvCBH 1l3jTv1GRvTEwFQ== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-ORIG-GUID: sccsODMDQNm-OJZkmTJ-Fk79DotTOjSG X-Proofpoint-GUID: sccsODMDQNm-OJZkmTJ-Fk79DotTOjSG X-Authority-Analysis: v=2.4 cv=e9wLiKp/ c=1 sm=1 tr=0 ts=69491708 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=M5bBm4G_KRvUKlQqVS4A:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjIyMDA5MSBTYWx0ZWRfX4ACqf5DUQeOk +lJXSmk7qA+nShNAxmv7agjjnLP0bchjurbQL/915G4U2NKXy3XMmgRePp1iUV+Y6i8/Hyo3S9j TJ5PuWWTwrDIxlN2ZnhaVX9X9bp9SmNnY7RSkqGljciG2ENjPQlDzSfAPjotbKA/Az2Acji7Fc7 fc/rl4oYEIPP/rhW2o/maCJwq8kh0bOyjPqVek4x3c2+fQV8+DB6bWRYTGKKfzAUthjlsXhGFYn fnubI4KJc5gz73MRRYhQCrBqUkv+iJbkmUxuMIs11ralRlOTr6DwkNywTukY0QqeWBCOZ0NksuQ SYBdYLoOiGik74oor00/J0LzhnnjpVDIZFUqIacFHWub+RC3xPDBEYFhiUM12jzOdcuY4HBNOhx gVHdWdkefpLykLudNakqFg7Z+tyVlBcIW4LJhEBWQnuDUB67oI08nwOzqpqhhxX3SrshgosHUP7 wse5gRQhGinzWNsTgQw== 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 lowpriorityscore=0 malwarescore=0 impostorscore=0 clxscore=1015 phishscore=0 adultscore=0 spamscore=0 priorityscore=1501 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512220091 We currently support sharing GPIOs between multiple devices whose drivers use either the GPIOLIB API *OR* the reset control API but not both at the same time. There's an unlikely corner-case where a reset-gpios pin can be shared by one driver using the GPIOLIB API and a second using the reset API. This will currently not work as the reset-gpio consumers are not described in firmware at the time of scanning so the shared GPIO just chooses one of the proxies created for the consumers when the reset-gpio driver performs the lookup. This can of course conflict in the case described above. In order to fix it: if we deal with the "reset-gpios" pin that's shared acconding to the firmware node setup, create a proxy for each described consumer as well as another one for the potential reset-gpio device. To that end: rework the matching to take this into account. Fixes: 7b78b26757e0 ("gpio: shared: handle the reset-gpios corner case") Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpiolib-shared.c | 182 ++++++++++++++++++++++++++++++--------= ---- 1 file changed, 129 insertions(+), 53 deletions(-) diff --git a/drivers/gpio/gpiolib-shared.c b/drivers/gpio/gpiolib-shared.c index f589109590c7c6bc9c0c1828ea15ab9003846523..baf7e07a3bb887dab8155078666= a15779e304409 100644 --- a/drivers/gpio/gpiolib-shared.c +++ b/drivers/gpio/gpiolib-shared.c @@ -76,6 +76,56 @@ gpio_shared_find_entry(struct fwnode_handle *controller_= node, return NULL; } =20 +static struct gpio_shared_ref *gpio_shared_make_ref(struct fwnode_handle *= fwnode, + const char *con_id, + enum gpiod_flags flags) +{ + char *con_id_cpy __free(kfree) =3D NULL; + + struct gpio_shared_ref *ref __free(kfree) =3D kzalloc(sizeof(*ref), GFP_K= ERNEL); + if (!ref) + return NULL; + + if (con_id) { + con_id_cpy =3D kstrdup(con_id, GFP_KERNEL); + if (!con_id_cpy) + return NULL; + } + + ref->dev_id =3D ida_alloc(&gpio_shared_ida, GFP_KERNEL); + if (ref->dev_id < 0) + return NULL; + + ref->flags =3D flags; + ref->con_id =3D no_free_ptr(con_id_cpy); + ref->fwnode =3D fwnode; + mutex_init(&ref->lock); + + return no_free_ptr(ref); +} + +static int gpio_shared_setup_reset_proxy(struct gpio_shared_entry *entry, + enum gpiod_flags flags) +{ + struct gpio_shared_ref *ref; + + list_for_each_entry(ref, &entry->refs, list) { + if (!ref->fwnode && ref->con_id && strcmp(ref->con_id, "reset") =3D=3D 0) + return 0; + } + + ref =3D gpio_shared_make_ref(NULL, "reset", flags); + if (!ref) + return -ENOMEM; + + list_add_tail(&ref->list, &entry->refs); + + pr_debug("Created a secondary shared GPIO reference for potential reset-g= pio device for GPIO %u at %s\n", + entry->offset, fwnode_get_name(entry->fwnode)); + + return 0; +} + /* Handle all special nodes that we should ignore. */ static bool gpio_shared_of_node_ignore(struct device_node *node) { @@ -106,6 +156,7 @@ static int gpio_shared_of_traverse(struct device_node *= curr) size_t con_id_len, suffix_len; struct fwnode_handle *fwnode; struct of_phandle_args args; + struct gpio_shared_ref *ref; struct property *prop; unsigned int offset; const char *suffix; @@ -138,6 +189,7 @@ static int gpio_shared_of_traverse(struct device_node *= curr) =20 for (i =3D 0; i < count; i++) { struct device_node *np __free(device_node) =3D NULL; + char *con_id __free(kfree) =3D NULL; =20 ret =3D of_parse_phandle_with_args(curr, prop->name, "#gpio-cells", i, @@ -182,15 +234,6 @@ static int gpio_shared_of_traverse(struct device_node = *curr) list_add_tail(&entry->list, &gpio_shared_list); } =20 - struct gpio_shared_ref *ref __free(kfree) =3D - kzalloc(sizeof(*ref), GFP_KERNEL); - if (!ref) - return -ENOMEM; - - ref->fwnode =3D fwnode_handle_get(of_fwnode_handle(curr)); - ref->flags =3D args.args[1]; - mutex_init(&ref->lock); - if (strends(prop->name, "gpios")) suffix =3D "-gpios"; else if (strends(prop->name, "gpio")) @@ -202,27 +245,32 @@ static int gpio_shared_of_traverse(struct device_node= *curr) =20 /* We only set con_id if there's actually one. */ if (strcmp(prop->name, "gpios") && strcmp(prop->name, "gpio")) { - ref->con_id =3D kstrdup(prop->name, GFP_KERNEL); - if (!ref->con_id) + con_id =3D kstrdup(prop->name, GFP_KERNEL); + if (!con_id) return -ENOMEM; =20 - con_id_len =3D strlen(ref->con_id); + con_id_len =3D strlen(con_id); suffix_len =3D strlen(suffix); =20 - ref->con_id[con_id_len - suffix_len] =3D '\0'; + con_id[con_id_len - suffix_len] =3D '\0'; } =20 - ref->dev_id =3D ida_alloc(&gpio_shared_ida, GFP_KERNEL); - if (ref->dev_id < 0) { - kfree(ref->con_id); + ref =3D gpio_shared_make_ref(fwnode_handle_get(of_fwnode_handle(curr)), + con_id, args.args[1]); + if (!ref) return -ENOMEM; - } =20 if (!list_empty(&entry->refs)) pr_debug("GPIO %u at %s is shared by multiple firmware nodes\n", entry->offset, fwnode_get_name(entry->fwnode)); =20 - list_add_tail(&no_free_ptr(ref)->list, &entry->refs); + list_add_tail(&ref->list, &entry->refs); + + if (strcmp(prop->name, "reset-gpios") =3D=3D 0) { + ret =3D gpio_shared_setup_reset_proxy(entry, args.args[1]); + if (ret) + return ret; + } } } =20 @@ -306,20 +354,16 @@ static bool gpio_shared_dev_is_reset_gpio(struct devi= ce *consumer, struct fwnode_handle *reset_fwnode =3D dev_fwnode(consumer); struct fwnode_reference_args ref_args, aux_args; struct device *parent =3D consumer->parent; + struct gpio_shared_ref *real_ref; bool match; int ret; =20 + lockdep_assert_held(&ref->lock); + /* The reset-gpio device must have a parent AND a firmware node. */ if (!parent || !reset_fwnode) return false; =20 - /* - * FIXME: use device_is_compatible() once the reset-gpio drivers gains - * a compatible string which it currently does not have. - */ - if (!strstarts(dev_name(consumer), "reset.gpio.")) - return false; - /* * Parent of the reset-gpio auxiliary device is the GPIO chip whose * fwnode we stored in the entry structure. @@ -328,33 +372,56 @@ static bool gpio_shared_dev_is_reset_gpio(struct devi= ce *consumer, return false; =20 /* - * The device associated with the shared reference's firmware node is - * the consumer of the reset control exposed by the reset-gpio device. - * It must have a "reset-gpios" property that's referencing the entry's - * firmware node. - * - * The reference args must agree between the real consumer and the - * auxiliary reset-gpio device. + * Now we need to find the actual pin we want to assign to this + * reset-gpio device. To that end: iterate over the list of references + * of this entry and see if there's one, whose reset-gpios property's + * arguments match the ones from this consumer's node. */ - ret =3D fwnode_property_get_reference_args(ref->fwnode, "reset-gpios", - NULL, 2, 0, &ref_args); - if (ret) - return false; + list_for_each_entry(real_ref, &entry->refs, list) { + if (!real_ref->fwnode) + continue; + + /* + * The device associated with the shared reference's firmware + * node is the consumer of the reset control exposed by the + * reset-gpio device. It must have a "reset-gpios" property + * that's referencing the entry's firmware node. + * + * The reference args must agree between the real consumer and + * the auxiliary reset-gpio device. + */ + ret =3D fwnode_property_get_reference_args(real_ref->fwnode, + "reset-gpios", + NULL, 2, 0, &ref_args); + if (ret) + continue; + + ret =3D fwnode_property_get_reference_args(reset_fwnode, "reset-gpios", + NULL, 2, 0, &aux_args); + if (ret) { + fwnode_handle_put(ref_args.fwnode); + continue; + } + + match =3D ((ref_args.fwnode =3D=3D entry->fwnode) && + (aux_args.fwnode =3D=3D entry->fwnode) && + (ref_args.args[0] =3D=3D aux_args.args[0])); =20 - ret =3D fwnode_property_get_reference_args(reset_fwnode, "reset-gpios", - NULL, 2, 0, &aux_args); - if (ret) { fwnode_handle_put(ref_args.fwnode); - return false; - } + fwnode_handle_put(aux_args.fwnode); + + if (!match) + continue; =20 - match =3D ((ref_args.fwnode =3D=3D entry->fwnode) && - (aux_args.fwnode =3D=3D entry->fwnode) && - (ref_args.args[0] =3D=3D aux_args.args[0])); + /* + * Reuse the fwnode of the real device, next time we'll use it + * in the normal path. + */ + ref->fwnode =3D fwnode_handle_get(real_ref->fwnode); + return true; + } =20 - fwnode_handle_put(ref_args.fwnode); - fwnode_handle_put(aux_args.fwnode); - return match; + return false; } #else static bool gpio_shared_dev_is_reset_gpio(struct device *consumer, @@ -379,12 +446,20 @@ int gpio_shared_add_proxy_lookup(struct device *consu= mer, const char *con_id, =20 list_for_each_entry(entry, &gpio_shared_list, list) { list_for_each_entry(ref, &entry->refs, list) { - if (!device_match_fwnode(consumer, ref->fwnode) && - !gpio_shared_dev_is_reset_gpio(consumer, entry, ref)) - continue; - guard(mutex)(&ref->lock); =20 + /* + * FIXME: use device_is_compatible() once the reset-gpio + * drivers gains a compatible string which it currently + * does not have. + */ + if (!ref->fwnode && strstarts(dev_name(consumer), "reset.gpio.")) { + if (!gpio_shared_dev_is_reset_gpio(consumer, entry, ref)) + continue; + } else if (!device_match_fwnode(consumer, ref->fwnode)) { + continue; + } + if ((!con_id && ref->con_id) || (con_id && !ref->con_id) || (con_id && ref->con_id && strcmp(con_id, ref->con_id) !=3D 0)) continue; @@ -471,8 +546,9 @@ int gpio_device_setup_shared(struct gpio_device *gdev) entry->offset, gpio_device_get_label(gdev)); =20 list_for_each_entry(ref, &entry->refs, list) { - pr_debug("Setting up a shared GPIO entry for %s\n", - fwnode_get_name(ref->fwnode)); + pr_debug("Setting up a shared GPIO entry for %s (con_id: '%s')\n", + fwnode_get_name(ref->fwnode) ?: "(no fwnode)", + ref->con_id ?: "(none)"); =20 ret =3D gpio_shared_make_adev(gdev, entry, ref); if (ret) --=20 2.47.3