From nobody Thu Apr 9 12:08:18 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 C9C713BA223 for ; Mon, 9 Mar 2026 12:43:05 +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=1773060190; cv=none; b=G1Y9cSG/6T9VOLQA9tXOWdt/3vQjej8sh6Dmzh5Jua/4l7KzM7DYVSg2CBcmLgrJfCRP2jfEgMbqq6ZmW9YRKkdy5F3T65eEWF3ZL1onqiNQDxI232zgj46zQVyhlhBLl+BT/BR2v7qugb+1Q8jHRDXg9m6yqGC482sPDGLuA7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773060190; c=relaxed/simple; bh=fRjGaFumkIPM5sHwzMJVqJbOfM3P51uoAqXe0hcwzCE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dd9yxZtgGSJuGkvwqFT9MtZC/wfulLwmd5rPeLx4IZaITN7e8986TxDkFe5FL+xpcCPxlonlaa6BB0dc13dOIto7NxcP3lyCwc/5b5dG8jJRHdqTdNm0pESNCOISKVdb2Y+nTmzciGwcQKJe9Qeq5JhP88a7Dekvm3CflQg6QsI= 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=IHv+fPDp; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Sp9/QGv7; 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="IHv+fPDp"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Sp9/QGv7" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6298S8UH3462862 for ; Mon, 9 Mar 2026 12:43:05 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= uQgxK+sZo0pv6EN5kq/1WnDmQHdicuSmR6PjheX+D7U=; b=IHv+fPDpkk8TLgUN eyuc/FpBmb4kAwPz6oCOD+WpIH1kno9hetM4L7AYmWcEgWH0DpvOXIFCl0H2pKui OUok74JIMDw2JzD7d+CASfFLN0seZl5fc1cDSjPpikdaQfWfwsYTgfrjwpNkbare UT4ecsRGUy6PJ4xRObqh54ASOeUPS0aydIvdzLqfgPXJyNlgoLS0vwBDPHpnv6jo oRdahdg3ppwuqCJgMnaUQm5rQUTiHP+ZkSNJSjEmMMoQPMT45LJ/ymc6cS4IjAbD 4bbsc03wpy8pOEV8uOWAfHJGbsvu0SBOPPEE4QtUSI/Pwcha9AUvnBnxQ4FnFEi4 iKL5xg== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4crcd8dbhn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 09 Mar 2026 12:43:04 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-8cd8b37d4b2so499959685a.3 for ; Mon, 09 Mar 2026 05:43:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773060184; x=1773664984; 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=uQgxK+sZo0pv6EN5kq/1WnDmQHdicuSmR6PjheX+D7U=; b=Sp9/QGv7qjWnXLhpMBHPU2IhLw7fjJ/tV7IVqhgG8wPnvBWkThMcjSZ8jZXjZhw5Zw XKDmpLh+5zFKSCZg6nGctecDv4U+Bf3ANTK1uobmAiv9jO2CJ2mUoRb+4qvTSghbcXdh KgSqBptTP8/qgA13IZeMAj8o3o6LiAF7FTun9O7MH+Zi/PUp8aRcOqRRb6anV0zQ9rEo xTQOAg2EMhzCufc+jsEL6R89nAKeJRPXAFpK6oEgVCkTYsyqwMYS8x/Fl3hYv6K50j6n cPQZnsiEfxXKIt+eqNmtGgr5zluujEAj9EvCWwaEiGNKncbqndCcgYqysp7fyV3dRkfY aPGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773060184; x=1773664984; 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=uQgxK+sZo0pv6EN5kq/1WnDmQHdicuSmR6PjheX+D7U=; b=ZIE3s0F8J7Xc1BtjvQ2LIfTd2ByxANpJZ+6Lhgs9WIvd14Aaie/xZanmGThcPeMIFi N5ieVGK77ibY2fgV7Rtks0pcfKt96wa8vW1mlsgFzX3onk8Sutg51q7elYmVeyoGiLgu K7X82ds1w8PNLAc910dkZs/vPsOnptOBktPkyCLYfDL4DekbheArnpmqwX7Km2mfIyfW ukqREOuHwRbY7xxH3QAatgvxwnU4pbSsTYulOLr4Wqc6zLFqz/YwnJ9XI80v2ATprrVu Fh+jM+87kl8O0oVkXg8XWnnrA4ssHsjwi3yum8lh4lhuPih0ywGj6LPIy0aMdy+WLrl7 e+XQ== X-Forwarded-Encrypted: i=1; AJvYcCUuw3LLpPCbxCW350Cd7jiQMGYNAVgL6z3NNXEx62tg1c0XKJ8RI1HIQcAd4HsruQTANUPGOnHYK67c0eE=@vger.kernel.org X-Gm-Message-State: AOJu0YyAhskFxrB5ESQhqHOUZil9V2CnpHKQY/WyE/NWj1whVRIQv3PH EImvpSN+scRlYykgsRU272vzogeJGEh6s8XqbNewyvSwcyiYxrhxHkScJMMzjFD05zcRkLDL9QL x6GRetICpWF//TbHR3OqTqVOqaCBTOqKBmL9gF6+53EhdyVkKNIb8AY3H9GaoqN4F79M= X-Gm-Gg: ATEYQzwEG01q+SbDUlU2MQlr5r6ifQGQFuYjWIATWt2mFmSoKTJxqNhc8+IhedpeEfv FvhIvzTnnwPRLzp1zFL1kt6cZ9yufcF60YJ00eE5A33PA84+kheU41M4RIdkwT/AfC9xaTylfyy KC2eXD/kZSBYSz84U6YPbeEBs9EL7KB6zKMOEXK05z/s2o27H31GyiwTT7nmBWcaYIQO+Va3GrX n+DeAGj2Bn9/lZzfhLqTmEvuC8CfdmIpRY2khrE4jXUo8PiAhb9pFDL92GfOEmnBsgQa06fGVoo wmzh7caJcxj8Q4vO/lzrqnJXuKYsom9Lz1vy+D7MsYXOcn4zrIj58FuTmR0JIDG7qrkYmK/wR6Z vTDOrFoxzZZ8DQkt98K74eH54vQRrApvFOv1xJJfd511flZSEW0Xo X-Received: by 2002:a05:620a:489a:b0:8b2:dcde:b670 with SMTP id af79cd13be357-8cd6d515a4emr1308510785a.70.1773060184223; Mon, 09 Mar 2026 05:43:04 -0700 (PDT) X-Received: by 2002:a05:620a:489a:b0:8b2:dcde:b670 with SMTP id af79cd13be357-8cd6d515a4emr1308505885a.70.1773060183666; Mon, 09 Mar 2026 05:43:03 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:494a:62d9:d95b:cb98]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48539e574b5sm107803345e9.8.2026.03.09.05.43.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2026 05:43:03 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 09 Mar 2026 13:42:39 +0100 Subject: [PATCH v2 3/6] gpio: sim: use fwnode-based GPIO hogs 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: <20260309-gpio-hog-fwnode-v2-3-4e61f3dbf06a@oss.qualcomm.com> References: <20260309-gpio-hog-fwnode-v2-0-4e61f3dbf06a@oss.qualcomm.com> In-Reply-To: <20260309-gpio-hog-fwnode-v2-0-4e61f3dbf06a@oss.qualcomm.com> To: Linus Walleij , Bartosz Golaszewski , Geert Uytterhoeven , Frank Rowand , Mika Westerberg , Andy Shevchenko , Aaro Koskinen , Janusz Krzysztofik , Tony Lindgren , Russell King , Jonathan Corbet , Shuah Khan Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-omap@vger.kernel.org, linux-doc@vger.kernel.org, brgl@kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6257; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=fRjGaFumkIPM5sHwzMJVqJbOfM3P51uoAqXe0hcwzCE=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBprsBJXQFZO+NRl/S5LzA+qQAwFD56PV0C8Dpzo Bt9U43MMBGJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaa7ASQAKCRAFnS7L/zaE w58ED/9w7/bKWzQRUd1R/MISkd+LsKPQNzedK+n4MFp9gHbgr/C18awbRdMU+vwaD5A4XbI8bIR /HoOGV+8CxRMHeEr9ML5c2vfnrquThtJnTy5lOruJ0z+q5XzyWRdWDBfoT47GF/SVAmrzOWLSvy i0E6mUh/zy23RrXwEWIKq8VHGA9niYBKO1TNFB9Yf2Tmel4vVvxtQMv9ytuAr9hESZ20FtFvEsP 0IrDctLoWPVb0vwYm3qKAbWnFvwcOorkD3fxl2vNdXFOurMvtoO4EU0Fo7Zsn3Oqqsy7dvy43EZ fHrsYt7JALp0KdIf7pHjEemadWvk7Z97rF2oL3ftLjVceM/3hQuKY3KG1E+BPm2Wptf65ROSRP5 4cwZHZY8lt+Tuq8ZXcREOCN+7VyHE//3zIvEHRuKfqjKm4ObsQQurkdMSpwUv12WQaXPGGzEKBQ rg42+gAdjPdoLL9pNS78gLjtLwG09YYCEaqmZqWmmJFR1gq/pgoTm2gunDa5OF6TuFcvuhvN9k4 oMF26Li6lxowY2aJPsojvOm83X7DzTqZyiMEP5slXT9xRYkHB+UMoRr+2bXdhT2jKSgX3n8tOzf 5Hwa5UasAbzhTlm+8+w7tQdY+egeF6HQ97o/RPH0qn0y91CLxti2FrboMeUl5B5DOYPhyp9O0VK L8bQNwyfQ4k86Xw== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-ORIG-GUID: bigxJueEIcciUZxkdxK8v3Nrj9lSfMbc X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzA5MDExNiBTYWx0ZWRfX1tGqlNMEsoKa l2iwaIiHsWhqeOYxaYZFvkV+KSzElyE71oVoLI2MA5l8tEk3CDNA2R/1uMMMyHmlw5//zjGEnHt Xt5EFAq8jXXXqLDtTdQ7yzGxD0wCDVFrtZFEHFjwNZOhU1UPTUHHAv8Ke9yyToLhLFrKDZaMj+c Won+F5bt0sNEKKu/D7a4aNoADWLuDrSmSsu6AlToPOadNeL9V6KX7LTJv7AeKLrv60P2tHWlv6m XEUkONRlm53B700RcA51u2O9TPPGHl0XRFCuh/x1b9uNFplPPnOQn9r4qYnQCO9SFaPeKtg36zV wUL9tI83CrWkURfqVlZmsEeEN7KYLgnBQUCcfMCriybSi0uqHPeoELPNXNGfeMCYvqVkVn09Jxa tgPuQuMatQldIvlJBL6+iwYsxrimfVKQ6fC9Z9eyPR+pbvkKlOpJQnH7w+qt0iayLBloZclgD9G UHUa4+XORnOfXG76w+A== X-Authority-Analysis: v=2.4 cv=O/w0fR9W c=1 sm=1 tr=0 ts=69aec058 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=VwQbUJbxAAAA:8 a=QyXUC8HyAAAA:8 a=EUspDBNiAAAA:8 a=WMYs8r0CEYFgD91zWOgA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-GUID: bigxJueEIcciUZxkdxK8v3Nrj9lSfMbc 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-09_03,2026-03-06_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 spamscore=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 impostorscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603090116 Convert gpio-sim to using software nodes for setting up simulated hogs instead of legacy machine hogs. Reviewed-by: Linus Walleij Reviewed-by: Andy Shevchenko Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpio-sim.c | 162 +++++++++++++++++---------------------------= ---- 1 file changed, 56 insertions(+), 106 deletions(-) diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c index 13b87c8e6d0caf62ce311dad409a9b4d3f091caa..51bcbdd91b4b027b7a340971a11= cce5280ca1295 100644 --- a/drivers/gpio/gpio-sim.c +++ b/drivers/gpio/gpio-sim.c @@ -40,6 +40,7 @@ =20 #define GPIO_SIM_NGPIO_MAX 1024 #define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */ +#define GPIO_SIM_HOG_PROP_MAX 5 #define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */ =20 static DEFINE_IDA(gpio_sim_ida); @@ -561,8 +562,6 @@ struct gpio_sim_device { */ struct mutex lock; =20 - struct gpiod_hog *hogs; - struct list_head bank_list; }; =20 @@ -774,102 +773,6 @@ static void gpio_sim_set_reserved_ranges(struct gpio_= sim_bank *bank, } } =20 -static void gpio_sim_remove_hogs(struct gpio_sim_device *dev) -{ - struct gpiod_hog *hog; - - if (!dev->hogs) - return; - - gpiod_remove_hogs(dev->hogs); - - for (hog =3D dev->hogs; hog->chip_label; hog++) { - kfree(hog->chip_label); - kfree(hog->line_name); - } - - kfree(dev->hogs); - dev->hogs =3D NULL; -} - -static int gpio_sim_add_hogs(struct gpio_sim_device *dev) -{ - unsigned int num_hogs =3D 0, idx =3D 0; - struct gpio_sim_bank *bank; - struct gpio_sim_line *line; - struct gpiod_hog *hog; - - list_for_each_entry(bank, &dev->bank_list, siblings) { - list_for_each_entry(line, &bank->line_list, siblings) { - if (line->offset >=3D bank->num_lines) - continue; - - if (line->hog) - num_hogs++; - } - } - - if (!num_hogs) - return 0; - - /* Allocate one more for the sentinel. */ - dev->hogs =3D kzalloc_objs(*dev->hogs, num_hogs + 1); - if (!dev->hogs) - return -ENOMEM; - - list_for_each_entry(bank, &dev->bank_list, siblings) { - list_for_each_entry(line, &bank->line_list, siblings) { - if (line->offset >=3D bank->num_lines) - continue; - - if (!line->hog) - continue; - - hog =3D &dev->hogs[idx++]; - - /* - * We need to make this string manually because at this - * point the device doesn't exist yet and so dev_name() - * is not available. - */ - if (gpio_sim_bank_has_label(bank)) - hog->chip_label =3D kstrdup(bank->label, - GFP_KERNEL); - else - hog->chip_label =3D kasprintf(GFP_KERNEL, - "gpio-sim.%u:%pfwP", - dev->id, - bank->swnode); - if (!hog->chip_label) { - gpio_sim_remove_hogs(dev); - return -ENOMEM; - } - - /* - * We need to duplicate this because the hog config - * item can be removed at any time (and we can't block - * it) and gpiolib doesn't make a deep copy of the hog - * data. - */ - if (line->hog->name) { - hog->line_name =3D kstrdup(line->hog->name, - GFP_KERNEL); - if (!hog->line_name) { - gpio_sim_remove_hogs(dev); - return -ENOMEM; - } - } - - hog->chip_hwnum =3D line->offset; - hog->dflags =3D line->hog->dir; - } - } - - gpiod_add_hogs(dev->hogs); - - return 0; -} - static struct fwnode_handle * gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, struct fwnode_handle *parent) @@ -917,12 +820,61 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, return fwnode_create_software_node(properties, parent); } =20 +static int gpio_sim_bank_add_hogs(struct gpio_sim_bank *bank) +{ + struct property_entry properties[GPIO_SIM_HOG_PROP_MAX]; + struct fwnode_handle *swnode; + struct gpio_sim_line *line; + struct gpio_sim_hog *hog; + unsigned int idx; + u32 gpios[2]; + + list_for_each_entry(line, &bank->line_list, siblings) { + if (!line->hog) + continue; + + hog =3D line->hog; + + gpios[0] =3D line->offset; + gpios[1] =3D 0; + + memset(properties, 0, sizeof(properties)); + + idx =3D 0; + properties[idx++] =3D PROPERTY_ENTRY_BOOL("gpio-hog"); + properties[idx++] =3D PROPERTY_ENTRY_U32_ARRAY("gpios", gpios); + properties[idx++] =3D PROPERTY_ENTRY_STRING("line-name", hog->name); + + switch (hog->dir) { + case GPIOD_IN: + properties[idx++] =3D PROPERTY_ENTRY_BOOL("input"); + break; + case GPIOD_OUT_HIGH: + properties[idx++] =3D PROPERTY_ENTRY_BOOL("output-high"); + break; + case GPIOD_OUT_LOW: + properties[idx++] =3D PROPERTY_ENTRY_BOOL("output-low"); + break; + default: + /* Would have been validated at configfs store. */ + WARN(1, "Unexpected hog direction value: %d", hog->dir); + return -EINVAL; + } + + swnode =3D fwnode_create_software_node(properties, bank->swnode); + if (IS_ERR(swnode)) + return PTR_ERR(swnode); + } + + return 0; +} + static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode) { struct fwnode_handle *child; =20 fwnode_for_each_child_node(swnode, child) - fwnode_remove_software_node(child); + gpio_sim_remove_swnode_recursive(child); =20 fwnode_remove_software_node(swnode); } @@ -977,12 +929,12 @@ static int gpio_sim_device_activate(struct gpio_sim_d= evice *dev) gpio_sim_remove_swnode_recursive(swnode); return ret; } - } =20 - ret =3D gpio_sim_add_hogs(dev); - if (ret) { - gpio_sim_remove_swnode_recursive(swnode); - return ret; + ret =3D gpio_sim_bank_add_hogs(bank); + if (ret) { + gpio_sim_remove_swnode_recursive(swnode); + return ret; + } } =20 pdevinfo.name =3D "gpio-sim"; @@ -991,7 +943,6 @@ static int gpio_sim_device_activate(struct gpio_sim_dev= ice *dev) =20 ret =3D dev_sync_probe_register(&dev->probe_data, &pdevinfo); if (ret) { - gpio_sim_remove_hogs(dev); gpio_sim_remove_swnode_recursive(swnode); return ret; } @@ -1007,7 +958,6 @@ static void gpio_sim_device_deactivate(struct gpio_sim= _device *dev) =20 swnode =3D dev_fwnode(&dev->probe_data.pdev->dev); dev_sync_probe_unregister(&dev->probe_data); - gpio_sim_remove_hogs(dev); gpio_sim_remove_swnode_recursive(swnode); } =20 --=20 2.47.3