From nobody Fri Apr 10 01:07:27 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 3274B37CD2E for ; Thu, 5 Mar 2026 09:51:59 +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=1772704320; cv=none; b=NHmhHDaGFwp5+yZp5Jy8h94eK5tdVOV5xJwa+NWoVgpR2vaPn+LeIeYnYFWqk96hAS/qpBu5Kb1j4HD6XONEkiEGmfMK4ME1B9JPG/i4oFlJSZDcKziGVNwAaubVE8eUP6ImNP56n2k/UpSOdkICQ3P/Ib/4IeExVkw0wsAzZP0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772704320; c=relaxed/simple; bh=nHHCSm94RSmEIVpUlb5PB0C2I8hqgvSMHOW0imJuagM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fFGGPnOhfhpaBL1EJ+qWahguSJGIqT3sq+NbdX14442oW9wFJYzYFRnYEhWTRHZsQyB5vbqK0EV/7roRz/saULVBSZWy5CfMHEOvebLjfXGBQuvlLI2mGtppR5TpLgDjCnTNwIARIJHCkTDQvazsaBfZn7l2F69pV9rPxJwMGuo= 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=jSg/4hJg; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Bj4LZCmJ; 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="jSg/4hJg"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Bj4LZCmJ" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62597T3e3160348 for ; Thu, 5 Mar 2026 09:51:58 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= 9lXayYJMb4sTE8GVHr0RX0rbTjMxVYXXnx+bVcFFBhk=; b=jSg/4hJghyJX7lU7 UqNa0NeFSNDZTu2aeyWp+WKa8GFkTQBkF4JpTzvgoE6DsaalJjvMwNzhqeVwMugr wNt6j5clx/9FfcwA03lArVyuABsLpfefsK4uYJk74G0QOSsPs0waA5+b0vxoXycF 5On7egWWivRCcT/cY/X6ZqFJ4TyMVEkdBDFaaQjVtmrBlzbrl2t1VDVWKnAMvntK OwirLW3Hk8VdDxZl5syi0QaUPGUSMRC2P2eONS7pEPFqESjFtwDnJbmk4Zk8Nogs Xn+dltxPgSn/YhBQLmUDCD4bkD1t7/JeqwT1R8blXiaIBsV0zd3Y7k0XTQap+Dad hc3KWQ== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cpjh5v4xw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 05 Mar 2026 09:51:58 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-899ee20dd34so341057766d6.3 for ; Thu, 05 Mar 2026 01:51:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1772704318; x=1773309118; 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=9lXayYJMb4sTE8GVHr0RX0rbTjMxVYXXnx+bVcFFBhk=; b=Bj4LZCmJyM0jeD9PWWmLxXcf0BQJyA3LITflcd+PpUQXm6WcUSZljdBfyMtfMBrFxr tVBY/+xY5P6bORGQDyzONOJLec9JC+ja46VJhaqwTV300aTgHuNGkkpR8mIj04QCYDbk adiG0lt5JoR5ufBIwu7MkK0IqbL7yAFXRgiMW1uqNTk3Og8quu+wU/IbMqzQYtZqqIFi 6xajzRGMuztJXaoGeRH+YSL8o9Gh03uI6Yqn1vovrPrNkNQvBhAECUsAb3Po4tjQq9Oi 5hoIjIdnIG+uXcW9MD1sKaHjHkJPqsFrh68DwVKl7kIMeIwOYERTq/hSai/BzdFDzyRn r5jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772704318; x=1773309118; 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=9lXayYJMb4sTE8GVHr0RX0rbTjMxVYXXnx+bVcFFBhk=; b=nglRD85tCnszpyzRsuvCypyoCggYdYqpjz7c2cwos1TShdW1fMvuKQJSxuI4cwaNRs SEDtUoDQ2wGTLHq84mqX/FddYdQ1tpBVrP/YwmjtgaUJAuio9za4D3n/cvA82BNScxtH Ke+hF7aaugNXqmxuLXvZwbtY/aC279YrshhJgn9xclaLblCL7dzpNbvaEn3RekELKRcA uE2PvASt8LuuiS9Kk5KzmIEDpyOehM+AdMNHP0KhIA7wtrcdMS1jo0qkTPGEMZZ51PfL 5TtdACocliXw4pK9c+SBAZq+aUu+zDK2fgd+v+22FAKBpn1KVz8PtwBWhxz+PwMun5qx DEKQ== X-Forwarded-Encrypted: i=1; AJvYcCVK7r8HGudKqjVhA1+3+kKvz60GfN5Kwq5KvntLXC4/qstXkjf+dUNu/gsIroNrqUSDyi7hfxuRAaFkWlU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1fTB0vl5RKhtnWSsAMT/q42yimcCJPLl481c8EN0jjNPeHC0K FAxwnyNPIjmzd02lp5YQ7OOo2b4aO4IpHACS0dbx89In5HTho8sZtexAo+mTWjEqD3Q0i914WfC nNg/ydYhA8MTgKiBqtF0ZJeF1PlKzjiZSCD3Xw6BsflMeBm4sQlC/D2HVaRZ8hYRtsmc= X-Gm-Gg: ATEYQzw3KQAA0J1sxg/AjXoJwELBx1MUUXJ4o5pw70Y/O0/hcY1lHyXSYNigfqlDlvk 6RmRuo1b/0wC0MLHvJWzpdBtqRt6PQCgzkLZUxgG5F3SJKOU56afzeTG6IYep3dwaf2VrYy11hd DqundK9DKkncu/Dida7/2MmjWkCTudSLkYPBlE3oW9ixyQLO/lSTf7ZKvw+Smn24vyhpjwCTMtO jZC4DsGkJxG/jXaJVD7F4+HwnzdCq1z1+xnth9aB1Cmv4pz7JaqNRDpzBbj/n4GaPJOHqhmnEQW MWK2JESc56g4057bMBsOkvI364bPzhSqBR9Y/eXJHy+B+oAZZNE9bE8L/86gTMFQuS5H38Sbwbw cJQ2Sq6Pb6SvqeFd7O6v/YKwcIDRUIavPSkSImtuHES7osjosPH/O X-Received: by 2002:a05:620a:1a94:b0:8c6:670c:953f with SMTP id af79cd13be357-8cd5afa51a0mr579593185a.58.1772704317652; Thu, 05 Mar 2026 01:51:57 -0800 (PST) X-Received: by 2002:a05:620a:1a94:b0:8c6:670c:953f with SMTP id af79cd13be357-8cd5afa51a0mr579591885a.58.1772704317222; Thu, 05 Mar 2026 01:51:57 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:8314:9d33:34c1:88ef]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4851ad1656bsm35598215e9.24.2026.03.05.01.51.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2026 01:51:56 -0800 (PST) From: Bartosz Golaszewski Date: Thu, 05 Mar 2026 10:51:30 +0100 Subject: [PATCH 5/6] gpio: remove machine 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: <20260305-gpio-hog-fwnode-v1-5-97d7df6bbd17@oss.qualcomm.com> References: <20260305-gpio-hog-fwnode-v1-0-97d7df6bbd17@oss.qualcomm.com> In-Reply-To: <20260305-gpio-hog-fwnode-v1-0-97d7df6bbd17@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=7113; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=nHHCSm94RSmEIVpUlb5PB0C2I8hqgvSMHOW0imJuagM=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpqVIr3OTbQ+EhTR/0KOPIsw7kVLs2Ax4N5tZgk wRj0KhbwzOJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaalSKwAKCRAFnS7L/zaE w8qkD/4sUoU6WuCaaKi2i05/0ZwSbE8TTFhBiPRiYDkdfYLS6WyiOS92WfOTLqKUORwgNJLJce7 0he2vPpJWv8I5nkqqglm3uo4hudl7P9RwR8tJnmUyt8MYPoKqNRJex3EC9r4Ud349DlvZ6zr7T2 PWuGqbTlNlY2qvulNPAM9PnvLU14dwT4Kw60jacWu6SzA8FpX8PSDLQYgayVxVaHf624BU3GIjp Xjm+lnPeVRt2m485svet2KXR3UfJTWMC9QkWIZJfwM8PCNtviAvdSBBQMgOpKXKL5T3IZGSj6Op wHdAkU0u8oT3Coc0JQTKRmZyQG1wtyoKJ5qNrwCoVJoNUL7NhEgP2xX5Ordg286h4szTMSwsRux 2KqcC3+Om7DAWIA6ZSRjIIhL5zkNvQ1N/3KN6NmQ2+RMnK+fw5WmrqcIE5igotMCNGdX5wWWiWp guEtIXSTXIg5teWGUIx4sLQaL4Sb4cB5jjrGWBUCH65KzsVTf6THOyyW48SIXDzUqqOk5t1Bp+4 s/TzXkY8lfm3VCmfqsEZZuccywZVEl5AEAX30YAtEYJeSRIfgduGmKMi7byO2CT/zv72YxHCZsd QYcKlgEAOGe9yEAFXwhmTQLZjLj5aywhBnJ2NKBwVsXJk9TZvilTgRHDA3inVwXpiJjoIPtYheC HhRpJgAzingRmUQ== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-GUID: V8ILkuP2uBspmthWpd67T54GU-FFHcOe X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzA1MDA3OSBTYWx0ZWRfXwISU1WeZr0Oa iABE7yBONwAaT7KPVhDDneJm4VS1SSLrsL+kcvBCXksgWsW4EiSR0CLwVJmsjAilJ5ZnZc8U49Z 5u2oKs8RJ7iE1qWwfhN431xvJSWilhLRmhXZ8cVD7EwuC2sUZXRhWUsMqhfITrdBdMhK3g54xO9 8zFgg/pESXqNDXpfzRXFgDyuQ8VJE1iaW/NsWXaueu5Z1pq5nx3IzmG8diIQ/kt7LcCpZzMjNA2 EOIKJNdhQ/YhuXYWY2GR70wKjf4DsxKXeT/PVLXNi1IchZ9cgDR7FWnGAhGD2OTc9hMIXoKaubY mrFhjVzOMgJLBUgsEAdjS1D0Y0j/9f09B/EyYtR7xxKW6/BYt3shwOVOPxmc8txfL+06sXpx5Ud 3Hy74Loy+CS5f5V86+brbwr6f4RHNBaTJPNKMQFN9AK96NZOTe0BYYnTgKCN+AgE+uKyCkRbLBt PHZXUYwxg63zcMakzWw== X-Authority-Analysis: v=2.4 cv=JK82csKb c=1 sm=1 tr=0 ts=69a9523e cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=ljULaDYbSg_dSHWjUBoA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-ORIG-GUID: V8ILkuP2uBspmthWpd67T54GU-FFHcOe 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-05_02,2026-03-04_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 phishscore=0 impostorscore=0 priorityscore=1501 malwarescore=0 clxscore=1015 bulkscore=0 suspectscore=0 lowpriorityscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603050079 With no more users, remove legacy machine hog API from the kernel. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- Documentation/driver-api/gpio/board.rst | 16 -------- drivers/gpio/gpiolib.c | 71 -----------------------------= ---- include/linux/gpio/machine.h | 33 --------------- 3 files changed, 120 deletions(-) diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver= -api/gpio/board.rst index 069b54d8591bdeb975a6c650d643db4f7eb98ab7..0993cac891fb5e4887a1aee6dea= e273197c6aae1 100644 --- a/Documentation/driver-api/gpio/board.rst +++ b/Documentation/driver-api/gpio/board.rst @@ -239,22 +239,6 @@ mapping and is thus transparent to GPIO consumers. A set of functions such as gpiod_set_value() is available to work with the new descriptor-oriented interface. =20 -Boards using platform data can also hog GPIO lines by defining GPIO hog ta= bles. - -.. code-block:: c - - struct gpiod_hog gpio_hog_table[] =3D { - GPIO_HOG("gpio.0", 10, "foo", GPIO_ACTIVE_LOW, GPIOD_OUT_H= IGH), - { } - }; - -And the table can be added to the board code as follows:: - - gpiod_add_hogs(gpio_hog_table); - -The line will be hogged as soon as the gpiochip is created or - in case the -chip was created earlier - when the hog table is registered. - Arrays of pins -------------- In addition to requesting pins belonging to a function one by one, a devic= e may diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index be2e6ed0e744c23939491717a060d3a8456c842b..e732427e2a975585ec873a5240a= b92e3a4cf187f 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -103,9 +103,6 @@ static DEFINE_MUTEX(gpio_devices_lock); /* Ensures coherence during read-only accesses to the list of GPIO devices= . */ DEFINE_STATIC_SRCU(gpio_devices_srcu); =20 -static DEFINE_MUTEX(gpio_machine_hogs_mutex); -static LIST_HEAD(gpio_machine_hogs); - const char *const gpio_suffixes[] =3D { "gpios", "gpio", NULL }; =20 static void gpiochip_free_hogs(struct gpio_chip *gc); @@ -930,36 +927,6 @@ static int gpiochip_setup_dev(struct gpio_chip *gc) return ret; } =20 -static void gpiochip_machine_hog(struct gpio_chip *gc, struct gpiod_hog *h= og) -{ - struct gpio_desc *desc; - int rv; - - desc =3D gpiochip_get_desc(gc, hog->chip_hwnum); - if (IS_ERR(desc)) { - gpiochip_err(gc, "%s: unable to get GPIO desc: %ld\n", - __func__, PTR_ERR(desc)); - return; - } - - rv =3D gpiod_hog(desc, hog->line_name, hog->lflags, hog->dflags); - if (rv) - gpiod_err(desc, "%s: unable to hog GPIO line (%s:%u): %d\n", - __func__, gc->label, hog->chip_hwnum, rv); -} - -static void gpiochip_machine_hog_lines(struct gpio_chip *gc) -{ - struct gpiod_hog *hog; - - guard(mutex)(&gpio_machine_hogs_mutex); - - list_for_each_entry(hog, &gpio_machine_hogs, list) { - if (!strcmp(gc->label, hog->chip_label)) - gpiochip_machine_hog(gc, hog); - } -} - int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode) { struct fwnode_handle *gc_node =3D dev_fwnode(&gc->gpiodev->dev); @@ -1049,8 +1016,6 @@ static int gpiochip_hog_lines(struct gpio_chip *gc) return ret; } =20 - gpiochip_machine_hog_lines(gc); - return 0; } =20 @@ -4584,42 +4549,6 @@ void gpiod_remove_lookup_table(struct gpiod_lookup_t= able *table) } EXPORT_SYMBOL_GPL(gpiod_remove_lookup_table); =20 -/** - * gpiod_add_hogs() - register a set of GPIO hogs from machine code - * @hogs: table of gpio hog entries with a zeroed sentinel at the end - */ -void gpiod_add_hogs(struct gpiod_hog *hogs) -{ - struct gpiod_hog *hog; - - guard(mutex)(&gpio_machine_hogs_mutex); - - for (hog =3D &hogs[0]; hog->chip_label; hog++) { - list_add_tail(&hog->list, &gpio_machine_hogs); - - /* - * The chip may have been registered earlier, so check if it - * exists and, if so, try to hog the line now. - */ - struct gpio_device *gdev __free(gpio_device_put) =3D - gpio_device_find_by_label(hog->chip_label); - if (gdev) - gpiochip_machine_hog(gpio_device_get_chip(gdev), hog); - } -} -EXPORT_SYMBOL_GPL(gpiod_add_hogs); - -void gpiod_remove_hogs(struct gpiod_hog *hogs) -{ - struct gpiod_hog *hog; - - guard(mutex)(&gpio_machine_hogs_mutex); - - for (hog =3D &hogs[0]; hog->chip_label; hog++) - list_del(&hog->list); -} -EXPORT_SYMBOL_GPL(gpiod_remove_hogs); - static bool gpiod_match_lookup_table(struct device *dev, const struct gpiod_lookup_table *table) { diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h index 44e5f162973eb6f6e85188f56ec34e1e3e2beab6..5eb88f5d0630f83b6a3a0e67271= 03c319e139b27 100644 --- a/include/linux/gpio/machine.h +++ b/include/linux/gpio/machine.h @@ -46,23 +46,6 @@ struct gpiod_lookup_table { struct gpiod_lookup table[]; }; =20 -/** - * struct gpiod_hog - GPIO line hog table - * @chip_label: name of the chip the GPIO belongs to - * @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO - * @line_name: consumer name for the hogged line - * @lflags: bitmask of gpio_lookup_flags GPIO_* values - * @dflags: GPIO flags used to specify the direction and value - */ -struct gpiod_hog { - struct list_head list; - const char *chip_label; - u16 chip_hwnum; - const char *line_name; - unsigned long lflags; - int dflags; -}; - /* * Helper for lookup tables with just one single lookup for a device. */ @@ -95,24 +78,10 @@ static struct gpiod_lookup_table _name =3D { \ .flags =3D _flags, \ } =20 -/* - * Simple definition of a single GPIO hog in an array. - */ -#define GPIO_HOG(_chip_label, _chip_hwnum, _line_name, _lflags, _dflags) \ -(struct gpiod_hog) { \ - .chip_label =3D _chip_label, \ - .chip_hwnum =3D _chip_hwnum, \ - .line_name =3D _line_name, \ - .lflags =3D _lflags, \ - .dflags =3D _dflags, \ -} - #ifdef CONFIG_GPIOLIB void gpiod_add_lookup_table(struct gpiod_lookup_table *table); void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n); void gpiod_remove_lookup_table(struct gpiod_lookup_table *table); -void gpiod_add_hogs(struct gpiod_hog *hogs); -void gpiod_remove_hogs(struct gpiod_hog *hogs); #else /* ! CONFIG_GPIOLIB */ static inline void gpiod_add_lookup_table(struct gpiod_lookup_table *table) {} @@ -120,8 +89,6 @@ static inline void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)= {} static inline void gpiod_remove_lookup_table(struct gpiod_lookup_table *table) {} -static inline void gpiod_add_hogs(struct gpiod_hog *hogs) {} -static inline void gpiod_remove_hogs(struct gpiod_hog *hogs) {} #endif /* CONFIG_GPIOLIB */ =20 #endif /* __LINUX_GPIO_MACHINE_H */ --=20 2.47.3