From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA8331E231F for ; Mon, 23 Jun 2025 09:00:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669217; cv=none; b=Np7fLZdZxyJ7Sp3oXq3LcTR/kSlBrf+JOlIYmRFWSTyP1ghjPeHAiDoyPHYrarWdx8SmtFcaudxrw6a0sDDjEKWXamVR/xxTQjjLtpAc5WmiY+1M0wX2MHvbv1ur5b6cJgbM+0Do/1C5ClXKLOvmoA7EjkvE/d/jHrThzhYSibI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669217; c=relaxed/simple; bh=MhU96uRLcWJzzxR6tZN2WX5FSYiJ7nK0M4z5jjqpgHU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WTAOmkzfzqGDKGxyckQnQ+/2G82DJGnN/Jk+iE/kUvZHgEC5KboFjmhP4X6EAoDQXSYDihSXKFjp9x25WZvm5N4aCx/g46r7D5eOCPVJP9eGfjHgSzOboD5wJd66hsZ9Dh0EXrwXymY09FK1G2uCs/gXU5LNC9mS8RFPNYqEGV4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=HYwQIwtO; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="HYwQIwtO" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-45348bff79fso43591375e9.2 for ; Mon, 23 Jun 2025 02:00:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669214; x=1751274014; 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=kzv7rEJjpNnX5QUp0Y2Z+jm414eiLT4c5eMO9fLQc/E=; b=HYwQIwtON918CohIJV1JwkS4jPy7GPbQyhFODgR42+85fxETWzX55WOsD8N/8tLV6Y AJp1iHpA0xOZjakxk4veu1Gi86nAjAa9KhW+jBorlknZzlYv12q8O06iC+tyD2lVePpk 1aLEHux8elGX07FhxTLmzWv4KjVQLpT0tf0ipHdMCScletPVUgh7ZsPRYzf5cWjV90O1 D9FsTAyRbMe4FUwJJxbSmaRYrx85W15b0wT9cdcMbEjtsRQy/o4hCzu3CGeJjoBwttTa 5Ys8uRxkRUITe/lm6vaY9JpFBYWctDZ0VRAiWEAoxF1kOZNXAQE3Pr2DC8DCym+4s4sg zb/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669214; x=1751274014; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kzv7rEJjpNnX5QUp0Y2Z+jm414eiLT4c5eMO9fLQc/E=; b=jtWGrJw8XNLRE6oNU7vCqMBEG4VaMcLBfYYXa9wnLm/n5mbNca0R4hB1GUwmrS8bxM e80ODLAlzQ3iqI8lGrTLJxLU1PpebWJjpo+tobPMk5nXKu277N9YA731SL7OIynD9grk kEAKd53pqsLLkQAFihm3we9yc0T2eQSJM4udWC9vBOJv18Ep6xbSzYXZbWJ24JHKCPKk 5nqMgKlA//5J78kZlvXv2gtVW9Z8mYnV28kJz+WKHo137bsNfUrZjKTqC4E3JB34KiEt zBUS75ZaA+7Jc91drKlPG+rAGyzw+chvXWQ21eqRmLjWB8UaO4xRtyvQK98ZzVgiBpMM E2MQ== X-Forwarded-Encrypted: i=1; AJvYcCW/ET5WxWd/f2Wks+simewGSO0GUhXTQQNSLnrhyZvfXRy55AWovmKkpEOfrFFD4/fm9VWcsXpSI1AEBLQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxyFdEsHC6zN5SHT5J9Kp03BxiizJOsq0+DyGVCABvSSYFW4ySZ ziD6fStCYvn9o/LxfD/x1IrnpHteD8/8mahREa9CnCPCoSw93sHAN+2DsKnuSfAK2Cw= X-Gm-Gg: ASbGncvE9/Ek+fkG09eEdXxijWqeBC9uHGuJmGCNsirKnI/mwmhjMGHl7W/Lp9RNcf3 CHTfBxPTzqHhBNshQzZrUiU2NDbnfYzMYFLhm8kuR2i7SXHJwT6lB3cl4uj9c6fyq2LbUohMkqz behAgK11ZUEV+brdZiRQmLZhXYxnfYNcFVnqvPnwc//H+uAoK2/7ZgPukp2CyNX4asHi4tit88V qBHb6noVeyPvEKy5JmwjSW+7qD7F9kEBMDv+D00TorDB/zpZf6P0PuXdoAOOw7K0B7H6EqPKCHg bWSi1Pr3hIfKbCzSOsp/7Wb6cuEb5xiLzRFBFZO6kZ4hi9jyr1PXwTo= X-Google-Smtp-Source: AGHT+IHSkumK5IdIX+YDtLlhPcb5/NvipdPY8QkB2OX0ajip0iOIR4tNSqyoiKEu/nWy8UPJZq4u1Q== X-Received: by 2002:a05:600c:8b11:b0:441:b19c:96fe with SMTP id 5b1f17b1804b1-4536b4bf64bmr81273415e9.10.1750669213158; Mon, 23 Jun 2025 02:00:13 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:12 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:49 +0200 Subject: [PATCH v2 1/9] gpio: sysfs: add a parallel class device for each GPIO chip using device IDs 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: <20250623-gpio-sysfs-chip-export-v2-1-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9913; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=n0E0L9Xpa7/NHeu4WacRTt4t+8eu7AU+P/7e1Mm6w74=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReZYmMGm4GZN8sGJRBVPbq98QfwXtPOWgwh8 dN0ie9SszWJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmQAKCRARpy6gFHHX cmAXD/4/nTuaRyHWOHB0oqGl3VKcz3T/TNKZ/060gfICot0rES9uO1rkgmBZHfz4CD9Wmw3Knp/ 4drpuIUIhTQ9R4enn2SHfup3ff6xMo+TTgsHqBFqs2PxchhGKHEaY/VX5JL6UC7asGsqOSUBGxb fi05qGEJhoAeAcD0RkMQyqLY1dKtaajkOT1SNfQMroz20ZYJkTpxOqgvSRb7bgbMPJaag5q/QaU 9qWW/DRJFvFflqpsl4D14VkyTFmutswdQIYQsU+oakKH4Bk1whoOn528CX3WnahqP+t0ix41CXn SVjo6HIyw3s/xA3fHTN44DK3ENKGCsyGo9UwzwTSugKSLg/MwALcWLs69KSApfxNaKXTw2VEqO8 QskdBzs7JOWZBCIOFJd0y3NKrQT6qTCLSwKMKH907Z6x994jDtdcu/0wLDDqJGed4S4F5xlezZ1 qBHoIOZbki2HP2vsvAOq7sdxnyEpOTGyk/W9JIBANCFHOAEnAsJSZZOGkDxGvb+4ahLQHH2y1FL ffGG3lQ4mAiMtar8h8Xq4OCVy9ujxem94nYgfH/na2cdqr3b0QIDJi2FqON9RD1gT8z4BL57cat zHI5S024JLtxlpqRlsDyvjSvocU+OEysjxvK9TRGtaCN+X9ihyQJHu7MMWodXTRHw6uXfJsGRTU 5Aas1tkKuvPnLrg== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski In order to enable moving away from the global GPIO numberspace-based exporting of lines over sysfs: add a parallel, per-chip entry under /sys/class/gpio/ for every registered GPIO chip, denoted by device ID in the file name and not its base GPIO number. Compared to the existing chip group: it does not contain the "base" attribute as the goal of this change is to not refer to GPIOs by their global number from user-space anymore. It also contains its own, per-chip export/unexport attribute pair which allow to export lines by their hardware offset within the chip. Caveat #1: the new device cannot be a link to (or be linked to by) the existing "gpiochip" entry as we cannot create links in /sys/class/xyz/. Caveat #2: the new entry cannot be named "gpiochipX" as it could conflict with devices whose base is statically defined to a low number. Let's go with "chipX" instead. While at it: the chip label is unique so update the untrue statement when extending the docs. Acked-by: Linus Walleij Signed-off-by: Bartosz Golaszewski --- Documentation/ABI/obsolete/sysfs-gpio | 7 +- drivers/gpio/gpiolib-sysfs.c | 191 +++++++++++++++++++++++++-----= ---- 2 files changed, 149 insertions(+), 49 deletions(-) diff --git a/Documentation/ABI/obsolete/sysfs-gpio b/Documentation/ABI/obso= lete/sysfs-gpio index 480316fee6d80fb7a0ed61706559838591ec0932..ff694708a3bef787afa42dedf94= faf209c44dbf0 100644 --- a/Documentation/ABI/obsolete/sysfs-gpio +++ b/Documentation/ABI/obsolete/sysfs-gpio @@ -25,8 +25,13 @@ Description: /active_low ... r/w as: 0, 1 /gpiochipN ... for each gpiochip; #N is its first GPIO /base ... (r/o) same as N - /label ... (r/o) descriptive, not necessarily unique + /label ... (r/o) descriptive chip name /ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1) + /chipX ... for each gpiochip; #X is the gpio device ID + /export ... asks the kernel to export a GPIO at HW offset X to usersp= ace + /unexport ... to return a GPIO at HW offset X to the kernel + /label ... (r/o) descriptive chip name + /ngpio ... (r/o) number of GPIOs exposed by the chip =20 This ABI is obsoleted by Documentation/ABI/testing/gpio-cdev and will be removed after 2020. diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index c4c21e25c682b939e4a0517393308343feb6585a..fbe93cda4ca16038a1cffe766f7= e5ead55ace5e6 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -46,6 +46,7 @@ struct gpiod_data { struct gpiodev_data { struct gpio_device *gdev; struct device *cdev_base; /* Class device by GPIO base */ + struct device *cdev_id; /* Class device by GPIO device ID */ }; =20 /* @@ -399,6 +400,14 @@ static const struct attribute_group *gpio_groups[] =3D= { * /base ... matching gpio_chip.base (N) * /label ... matching gpio_chip.label * /ngpio ... matching gpio_chip.ngpio + * + * AND + * + * /sys/class/gpio/chipX/ + * /export ... export GPIO at given offset + * /unexport ... unexport GPIO at given offset + * /label ... matching gpio_chip.label + * /ngpio ... matching gpio_chip.ngpio */ =20 static ssize_t base_show(struct device *dev, struct device_attribute *attr, @@ -428,6 +437,111 @@ static ssize_t ngpio_show(struct device *dev, struct = device_attribute *attr, } static DEVICE_ATTR_RO(ngpio); =20 +static int export_gpio_desc(struct gpio_desc *desc) +{ + int offset, ret; + + CLASS(gpio_chip_guard, guard)(desc); + if (!guard.gc) + return -ENODEV; + + offset =3D gpio_chip_hwgpio(desc); + if (!gpiochip_line_is_valid(guard.gc, offset)) { + pr_debug_ratelimited("%s: GPIO %d masked\n", __func__, + gpio_chip_hwgpio(desc)); + return -EINVAL; + } + + /* + * No extra locking here; FLAG_SYSFS just signifies that the + * request and export were done by on behalf of userspace, so + * they may be undone on its behalf too. + */ + + ret =3D gpiod_request_user(desc, "sysfs"); + if (ret) + return ret; + + ret =3D gpiod_set_transitory(desc, false); + if (ret) { + gpiod_free(desc); + return ret; + } + + ret =3D gpiod_export(desc, true); + if (ret < 0) { + gpiod_free(desc); + } else { + set_bit(FLAG_SYSFS, &desc->flags); + gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_REQUESTED); + } + + return ret; +} + +static int unexport_gpio_desc(struct gpio_desc *desc) +{ + /* + * No extra locking here; FLAG_SYSFS just signifies that the + * request and export were done by on behalf of userspace, so + * they may be undone on its behalf too. + */ + if (!test_and_clear_bit(FLAG_SYSFS, &desc->flags)) + return -EINVAL; + + gpiod_unexport(desc); + gpiod_free(desc); + + return 0; +} + +static ssize_t do_chip_export_store(struct device *dev, + struct device_attribute *attr, + const char *buf, ssize_t size, + int (*handler)(struct gpio_desc *desc)) +{ + struct gpiodev_data *data =3D dev_get_drvdata(dev); + struct gpio_device *gdev =3D data->gdev; + struct gpio_desc *desc; + unsigned int gpio; + int ret; + + ret =3D kstrtouint(buf, 0, &gpio); + if (ret) + return ret; + + desc =3D gpio_device_get_desc(gdev, gpio); + if (IS_ERR(desc)) + return PTR_ERR(desc); + + ret =3D handler(desc); + if (ret) + return ret; + + return size; +} + +static ssize_t chip_export_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return do_chip_export_store(dev, attr, buf, size, export_gpio_desc); +} + +static struct device_attribute dev_attr_export =3D __ATTR(export, 0200, NU= LL, + chip_export_store); + +static ssize_t chip_unexport_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return do_chip_export_store(dev, attr, buf, size, unexport_gpio_desc); +} + +static struct device_attribute dev_attr_unexport =3D __ATTR(unexport, 0200, + NULL, + chip_unexport_store); + static struct attribute *gpiochip_attrs[] =3D { &dev_attr_base.attr, &dev_attr_label.attr, @@ -436,6 +550,15 @@ static struct attribute *gpiochip_attrs[] =3D { }; ATTRIBUTE_GROUPS(gpiochip); =20 +static struct attribute *gpiochip_ext_attrs[] =3D { + &dev_attr_label.attr, + &dev_attr_ngpio.attr, + &dev_attr_export.attr, + &dev_attr_unexport.attr, + NULL, +}; +ATTRIBUTE_GROUPS(gpiochip_ext); + /* * /sys/class/gpio/export ... write-only * integer N ... number of GPIO to export (full access) @@ -447,7 +570,7 @@ static ssize_t export_store(const struct class *class, const char *buf, size_t len) { struct gpio_desc *desc; - int status, offset; + int status; long gpio; =20 status =3D kstrtol(buf, 0, &gpio); @@ -461,40 +584,7 @@ static ssize_t export_store(const struct class *class, return -EINVAL; } =20 - CLASS(gpio_chip_guard, guard)(desc); - if (!guard.gc) - return -ENODEV; - - offset =3D gpio_chip_hwgpio(desc); - if (!gpiochip_line_is_valid(guard.gc, offset)) { - pr_debug_ratelimited("%s: GPIO %ld masked\n", __func__, gpio); - return -EINVAL; - } - - /* No extra locking here; FLAG_SYSFS just signifies that the - * request and export were done by on behalf of userspace, so - * they may be undone on its behalf too. - */ - - status =3D gpiod_request_user(desc, "sysfs"); - if (status) - goto done; - - status =3D gpiod_set_transitory(desc, false); - if (status) { - gpiod_free(desc); - goto done; - } - - status =3D gpiod_export(desc, true); - if (status < 0) { - gpiod_free(desc); - } else { - set_bit(FLAG_SYSFS, &desc->flags); - gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_REQUESTED); - } - -done: + status =3D export_gpio_desc(desc); if (status) pr_debug("%s: status %d\n", __func__, status); return status ? : len; @@ -511,7 +601,7 @@ static ssize_t unexport_store(const struct class *class, =20 status =3D kstrtol(buf, 0, &gpio); if (status < 0) - goto done; + return status; =20 desc =3D gpio_to_desc(gpio); /* reject bogus commands (gpiod_unexport() ignores them) */ @@ -520,18 +610,7 @@ static ssize_t unexport_store(const struct class *clas= s, return -EINVAL; } =20 - status =3D -EINVAL; - - /* No extra locking here; FLAG_SYSFS just signifies that the - * request and export were done by on behalf of userspace, so - * they may be undone on its behalf too. - */ - if (test_and_clear_bit(FLAG_SYSFS, &desc->flags)) { - gpiod_unexport(desc); - gpiod_free(desc); - status =3D 0; - } -done: + status =3D unexport_gpio_desc(desc); if (status) pr_debug("%s: status %d\n", __func__, status); return status ? : len; @@ -561,6 +640,11 @@ static int match_gdev(struct device *dev, const void *= desc) static struct gpiodev_data * gdev_get_data(struct gpio_device *gdev) __must_hold(&sysfs_lock) { + /* + * Find the first device in GPIO class that matches. Whether that's + * the one indexed by GPIO base or device ID doesn't matter, it has + * the same address set as driver data. + */ struct device *cdev __free(put_device) =3D class_find_device(&gpio_class, NULL, gdev, match_gdev); @@ -787,6 +871,16 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) return err; } =20 + data->cdev_id =3D device_create_with_groups(&gpio_class, parent, + MKDEV(0, 0), data, + gpiochip_ext_groups, + "chip%d", gdev->id); + if (IS_ERR(data->cdev_id)) { + device_unregister(data->cdev_base); + kfree(data); + return PTR_ERR(data->cdev_id); + } + return 0; } =20 @@ -802,6 +896,7 @@ void gpiochip_sysfs_unregister(struct gpio_device *gdev) return; =20 device_unregister(data->cdev_base); + device_unregister(data->cdev_id); kfree(data); } =20 --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0A5A1F3FC6 for ; Mon, 23 Jun 2025 09:00:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669217; cv=none; b=eDddgzyyF2MgrlrmqS8wCO3BevsTy69R4aAHhHKjsNvKagFlSeqwNKy33MQlTZclPUZBNEPDxhqoH1KJjSxDE7NR0PSe9ilQ15C9nvWieu6aE8w+gHiLv4TGVZrWa+VPDNf/jCpUmvMz3ZOlbtokfLQCxtnCEF3nPNhHKwNyP5k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669217; c=relaxed/simple; bh=LMMzvYzzvjG38iEZjEOznfplicoDrXdsAljFaqLztwk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rNRYWCRVcE2XIIRW8XdgQhva+IR3ywivaSI3EtWLygw1an8gof1QDoNSgM4rV9/p45sqopwxaWTB5XcDT/kaQXs3lk7OdG7VeHVCfREBFJfcgcSdPiz8yvckwOqxgcNrXfxTBG+KEzU6Pnp78/Of5dvE71zUsFEL8cPvTcuZdv0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=CgqorTMY; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="CgqorTMY" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-453398e90e9so25376805e9.1 for ; Mon, 23 Jun 2025 02:00:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669214; x=1751274014; 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=rFPrbBis31M1FWPldXMCVueSfhaYkIokgycz/pYcTjI=; b=CgqorTMYJg1JOPJ/Hkaa8abYzJn8+b9MG/OxArqIbYlJAMaGkRAkTI6om3v67orRQP IJzV71n4UmYYKLgMxypq/hNtToqEehTw7FDClJ4Ccq07Ad8pPvKaKVmE34BsQ5QSisx0 unH808SS8LXXrC69hOsGFzDu2W6AZ8xrMQxVOTjXkWw+WZlPPRZTsyOLNM8ZqQxAK/Uf LwuXeroVizdDbiXPtPoiURkK0aZTrdNl+9AvXA77wLNLQ2+WzGsx9j2iPA0cAFGbipcZ AonlD1sMDke5ZICTPcFajPkfMraDoT6lilGoApgWKYa2kFP93501c6JVvMfxyyJopBbi EYog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669214; x=1751274014; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rFPrbBis31M1FWPldXMCVueSfhaYkIokgycz/pYcTjI=; b=Z4NdFinRySkAha/NgzdbU2u9HvTbZPiWjOTwt5l+2BNqYjh9SSA9aF0wYj9DyvMRoX M4aUyTFZaMaLAQYObFaSXJIXibOwG9UAxg1eLWhi/GK/RSzkz5YQKTcSqpu6G7HL12I2 ct8oO8vkoHTZMTj5caz158p4wVrpcCf/8O+A0Hh8f32jBKimdIKN33A6J6862rXZEcVL tN9ZZbQd4g7yUp/EI051tWqDnYq/YvbKnq7dR/ScSB/Yk5QC4xXo1dddljVwDJ14ta5r a9czkDI0VD7l/rM9nFhdw5Bs/70l7A3mirSGIS3480kHVdzc+sf/Kpsi7Qfo+fxEQA9r U9Xg== X-Forwarded-Encrypted: i=1; AJvYcCUC7e8CW/zYptyo+kT4tzbFjxnDyJ7ZckzTvhpaoa3j1+NLCwlhVSc8wW5wC+NoQFboXq91UTWRhiYjo8c=@vger.kernel.org X-Gm-Message-State: AOJu0YyJN4fr1Lj8denluFFPgcCp18FE6rn1fV2f/ZrlA6ZqYbQeOsCK MtgCsxDKRk+ZVBdgtJ35QQhyRTQPeLARDSb+k/S1Z8UM+YUU5nkmRfeF3LPl5s6dhYI= X-Gm-Gg: ASbGncsHySst7kz4lRsDHe1bwYcYWo7zcEuTplDH7Q0P9POsUt008gI/u1dA3eLT1d5 yAHV0xuAigOoPW668mkR/AvNv3IIjFEIxr8O2g652l2rq38i48xikYI9jROHgYeFvgG7xWQqnxn cpSOmMZQLNM7XUaWNeR2SWsuiQd3XuOYWAmhPwMyqjU3M5hI4BeCdm2oqxFkQP9e8Dc+eWpgxf+ bp03GhgFCKMWSM+EK9gcMpDhLvxzGqChFurrLEB6VmhMbXBVYRceYjLaIdTqDV0YXN3Xw94tCXT LsiBEq8Q1smCSTGlIv9QkIeiXYv2qbme96E9dTiDOzE4DFAMDXfKRe8= X-Google-Smtp-Source: AGHT+IFiqphOwIAp1gwVBxlM5VHKRW3Stro/mAtkhR5RDThXx7HvA9Wt8p1b1VdcA9D96nSU7N3fFA== X-Received: by 2002:a05:600c:3ba4:b0:441:b3eb:570a with SMTP id 5b1f17b1804b1-453659c3b97mr102746135e9.2.1750669214064; Mon, 23 Jun 2025 02:00:14 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:13 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:50 +0200 Subject: [PATCH v2 2/9] gpio: sysfs: only get the dirent reference for the value attr once 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: <20250623-gpio-sysfs-chip-export-v2-2-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3042; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=mzJFO+h0UcAa+8+bwdK7egfjETmRhN80xURJe7gsS0g=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReZUDcz/qkX8h1xwuVFBAw4cyLplYNmfw6vb 1qk7fzzq1mJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmQAKCRARpy6gFHHX cogtEACKbpXBs1IMdyYq7yvElvlU6Lc6oV8GjwJ18PlQqWVK3cQwlLgV3iVHyhflHGbxIWUPmk2 bnNMYoPLRKiWup5QKqUgfvLJOCPNGVbwA0W1HrChopeZNde/+docVVMwMcR67Z/+FhZDTpTWQ2M NUL+fjoFUyc97/ZP9JYZuwcG7WlJzfc8DDV8MsUtqbm67HgzATNtLdk42VtvQB/eZFZX7ncnN5Z D6f29lkIMO1CLMADNCQbHuJza82CXcZuxSXSIQXnK8r7z7J0ivYnEN6MCtOkpYd3C6L+uhiO/PV E8nhwbUECvRQGFBGsHdJyui7sHhgOer+ZJi49AG7+Ebct77W0TeFTGx4QYgzk1z29Rk6vJVL1/h b9R1yyrvfERxMUjcooBxNHoAYR4qQInyGCYhn4IlkQMPT6NFWc0KuMq8KxxNk8cEYyS3ZcHDAnz nvcQbcMWInrcc3o39LONNWBjqkqpYdqMGqT0i/VGGKOxlyklGynKruwujMA5S2FwFhSPHUU7B2C Bsrc4LW4SgLQ1hoLJxePvCJTp3OoHxohJBnWRcOJVwZqaDpsmmzl2AXREmRGwD44FQH0eLRqlw5 t3SOEOhZvcFcVH9elyoCE20sSazlz27hzcXCNR8KuV41BG+2vr2UjJvw9dQwOjF4KAVYv+4TUCD i3czUtPUX/CAU3g== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski There's no reason to retrieve the reference to the sysfs dirent every time we request an interrupt, we can as well only do it once when exporting the GPIO. Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpiolib-sysfs.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index fbe93cda4ca16038a1cffe766f7e5ead55ace5e6..c812c58e171448501f3d67e6287= d32fcac00797d 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -36,7 +36,7 @@ struct gpiod_data { struct gpio_desc *desc; =20 struct mutex mutex; - struct kernfs_node *value_kn; + struct kernfs_node *value_class_node; int irq; unsigned char irq_flags; =20 @@ -156,7 +156,7 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv) { struct gpiod_data *data =3D priv; =20 - sysfs_notify_dirent(data->value_kn); + sysfs_notify_dirent(data->value_class_node); =20 return IRQ_HANDLED; } @@ -177,10 +177,6 @@ static int gpio_sysfs_request_irq(struct device *dev, = unsigned char flags) if (data->irq < 0) return -EIO; =20 - data->value_kn =3D sysfs_get_dirent(dev->kobj.sd, "value"); - if (!data->value_kn) - return -ENODEV; - irq_flags =3D IRQF_SHARED; if (flags & GPIO_IRQF_TRIGGER_FALLING) { irq_flags |=3D test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? @@ -203,7 +199,7 @@ static int gpio_sysfs_request_irq(struct device *dev, u= nsigned char flags) */ ret =3D gpiochip_lock_as_irq(guard.gc, gpio_chip_hwgpio(desc)); if (ret < 0) - goto err_put_kn; + goto err_clr_bits; =20 ret =3D request_any_context_irq(data->irq, gpio_sysfs_irq, irq_flags, "gpiolib", data); @@ -216,10 +212,9 @@ static int gpio_sysfs_request_irq(struct device *dev, = unsigned char flags) =20 err_unlock: gpiochip_unlock_as_irq(guard.gc, gpio_chip_hwgpio(desc)); -err_put_kn: +err_clr_bits: clear_bit(FLAG_EDGE_RISING, &desc->flags); clear_bit(FLAG_EDGE_FALLING, &desc->flags); - sysfs_put(data->value_kn); =20 return ret; } @@ -242,7 +237,6 @@ static void gpio_sysfs_free_irq(struct device *dev) gpiochip_unlock_as_irq(guard.gc, gpio_chip_hwgpio(desc)); clear_bit(FLAG_EDGE_RISING, &desc->flags); clear_bit(FLAG_EDGE_FALLING, &desc->flags); - sysfs_put(data->value_kn); } =20 static const char *const trigger_names[] =3D { @@ -726,8 +720,16 @@ int gpiod_export(struct gpio_desc *desc, bool directio= n_may_change) goto err_free_data; } =20 + data->value_class_node =3D sysfs_get_dirent(dev->kobj.sd, "value"); + if (!data->value_class_node) { + status =3D -ENODEV; + goto err_unregister_device; + } + return 0; =20 +err_unregister_device: + device_unregister(dev); err_free_data: kfree(data); err_clear_bit: @@ -804,6 +806,7 @@ void gpiod_unexport(struct gpio_desc *desc) =20 data =3D dev_get_drvdata(dev); clear_bit(FLAG_EXPORT, &desc->flags); + sysfs_put(data->value_class_node); device_unregister(dev); =20 /* --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BB022309B5 for ; Mon, 23 Jun 2025 09:00:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669218; cv=none; b=UJohaztxv7o4zB2qewqUt0PKjKTv3/y1KCKY8vnxFUedUMul+qoxeRHpslqwcrnaOyGd8nQel3rwWFqTB5MxKa1I2/I8kHyKBXdOUniPpTKDMBLsZraPjKPSLOs/A29d5LUaYgcw/sMdC+gR3noEahMyfBJdvYTq+VlydE4/CHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669218; c=relaxed/simple; bh=R0bkctS2alikQmCMg8aa3G+4GSpoB23HfcSsrf+yE8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kt0Z34Fakc+RX5ovPUz6HC1jlLO56k67o5y7g7WBUSBjou/lfnWFtsSm8CMj4d0kBcLCQE2FdV0YVwC16drmgELUppZQs0SPK9S0NTDTXqqA7JGXlz7aERtXWxq+z0SLb+6MFVNpBvQX1NRwi2OlfBqGium97F/v2yna55aftpU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=FyDSimNd; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="FyDSimNd" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4531e146a24so22794705e9.0 for ; Mon, 23 Jun 2025 02:00:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669215; x=1751274015; 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=aPfKuY0fkkQZVEv03Y+crBWt/YupigPxkTVkaxpmsGQ=; b=FyDSimNdBtjVYweLEkp7EqGXseWQxTR2stX+0NzdCOOxBYIfnoSdJsDcLDBOiLIvHM YiB9mtSPWDbwOj92kmae11y/2ekb36xHqPLUcgrLYzpW3lJIFjGfqTjbk1UUn6W4noWF lj20A373kgQuolahIXjvHLBaJ0bTJKevRnOAB9LQjyYY8gw1ZeOvCX23FB36dPkgkFa4 8dNLun746qo1UaqYlhsnBPQMEMKOVLG5yTHvY0cOAnCiCtnCqnB1QQCCcXHfTrXO7Hsd UxD3GCSqjHf8ts6qx1GKJn8V/3MjiEYBIZDPcH/gl+X3qty9Umqr8YtEqMHau2YEDaYO M/3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669215; x=1751274015; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aPfKuY0fkkQZVEv03Y+crBWt/YupigPxkTVkaxpmsGQ=; b=mJGATkZiQGJeNKW+Ww/xP0dH66/xzUxqM3S96/9LhLB6kI1Qaf5LaQ3Z3O2s/uU9FN ajud2XfQTCvCQfCnGFXEITGxTvcUMienr1RPVzJrFDwwlileLuYDm7ztdayDY5U3+foh 8DTKXqfZEqpl9ZDQspYTJsfGjTHePWCZY1jiTN9DdKn4L+2QYJc3Hc+hQ4ZlvxnmaN0v PBTF96ZLgpxChHSIRUZXEGEhVtKkO4NeoQCrJ+pDpxbvc7yHWlN/a7/nb3bWgGczFqO3 ygPHexXueEsL7hIpNMYl5PqNB/UgK374eI8R36VEUnQb/FYwxb+YfBSvd4HK6ka3Viw7 rrMA== X-Forwarded-Encrypted: i=1; AJvYcCW6C1VAaoFLVq9MNNlRMIRa+UAxqVxgNhtmCMpgA51O3zlJfLZg3d3m3F0ZUvlLJJMLhxClMzcT2NYhscI=@vger.kernel.org X-Gm-Message-State: AOJu0YzBPlJQJ/pzwTMNBVvxtCeRZJtN8icEZz499Fh6JZeZeeK0JdgI +cRRKScHpTzvgjI71hXtGYtEG8XIPQJwXiWeMEloZSaJNmBHjXrLqVDbRu/wXd4/wDQ= X-Gm-Gg: ASbGncsxf16TzNsLaJmL+0RwodB1QXTWEVw1QM8tfOhzeCGdLHFFCqrKXyWK4IVFrZX OSSJQfgdBAURBsIhPOpsHxKLR59SxIMEHfwULTYo+Bzhxx87ew+1wVa4kmRIPtUzuhzALTxPdEp jJVuOqywF4KPzJndVQjFDGE+cbZODAKT1eYuvEjNMsixm19oDlnZ0ceUiIo1NW56f01lBThAIoM nSdU0lsyK+x/FqndV7TDv1hMjaw7+f1g0VGkSumktX78L048DVxSfjU3G7f4bMSFB9mXfkShQiC zKxXjVzZ8Hlp+tEX9dQc6g2aZB77BrkXrEhsJc8OroTFwsuOn9MH0VQ= X-Google-Smtp-Source: AGHT+IFcB8iYykDo6IpLdIlEMIQC2gR1QqT11vtascJY66lYvBqHii/Q2Ub3UZXkK2cLdC5AbSyaaA== X-Received: by 2002:a05:600c:524e:b0:453:c39:d0c2 with SMTP id 5b1f17b1804b1-453659edd0bmr93524025e9.24.1750669215443; Mon, 23 Jun 2025 02:00:15 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:14 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:51 +0200 Subject: [PATCH v2 3/9] gpio: sysfs: pass gpiod_data directly to internal GPIO sysfs functions 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: <20250623-gpio-sysfs-chip-export-v2-3-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3362; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=Jw0DYtOwCcq747xxbRUcAHQ5ayN8hdxN0qXCzK8w+7s=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReZ+pvD3vswPbC4Rt4lzzQdtrIxaK5Oe/pJz muWH+pfv86JAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmQAKCRARpy6gFHHX cqXPD/9SD957p0e1l+YnAOB0rAqNVRVLFTOf/CN0fj3o2kPZoj+eolAq6Hvi1jvhL81Ijdj0Ce/ KXYGYfeoBi4qB37YQYQtzV5b3GL0crL8UHC4jlUvx3Cx5+gO4JYI6MqbnIBbZ7rSBEVzTOZpMR2 ruTiQon0OanL7qbjXS61KdYgMLRmRogkErUKll7bfVwmw9fIq2t4xN0LEp7JmWIvrB3hdHWeP0B 4+k9c3b5wsQ9JBwREXVh/5z5ZUp6UUG7u5OXfZa6/pPJdcH5qwBmpprXnFkpXsPRBqhKB87zbGW XRT6F5GTONLyQawBrKr1JoUCXEjnpzRNhjKqMHfxLgYwnvB87wtCDu0xZeeOaXgNOmNyaddvKJK 2VykYbDw7MhICqID8vyZKf+hOIwbfhyqMwalg1F9iOpwMO5jWLCjopDoYm3J1767292IeOEXV3R qqzfuNG6Jtr22CW4saacg9e8Q4HYiVY7WfoecAI9rmtmKkCc6YHRwj9nNRID7bOdBanIB+pnZEG k9ryNjkjjDj39dG9OY0fIDub9Rd6Pn2v8JZn3qFvqolKnv3/1ODuvl68Jf9xSA4ovBCbjPRsG7v 4PgE8Bq8y3e2GynC1lbjX0Itn1n/MdUr4wt9UDndIXMQf/LQjHbBgCYABQYdJHxGeKEH9iG+iVs LtBhDdJmgEi/+bA== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski To make the transition to not using dev_get_drvdata() across line callbacks for sysfs attributes, pass gpiod_data directly to gpio_sysfs_request_irq(), gpio_sysfs_free_irq() and gpio_sysfs_set_active_low() instead of having it wrapped in struct device. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/gpiolib-sysfs.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index c812c58e171448501f3d67e6287d32fcac00797d..0e2c6b2d0940b1d4e4ad0a90aa1= 72e7d01908969 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -162,9 +162,8 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv) } =20 /* Caller holds gpiod-data mutex. */ -static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags) +static int gpio_sysfs_request_irq(struct gpiod_data *data, unsigned char f= lags) { - struct gpiod_data *data =3D dev_get_drvdata(dev); struct gpio_desc *desc =3D data->desc; unsigned long irq_flags; int ret; @@ -223,9 +222,8 @@ static int gpio_sysfs_request_irq(struct device *dev, u= nsigned char flags) * Caller holds gpiod-data mutex (unless called after class-device * deregistration). */ -static void gpio_sysfs_free_irq(struct device *dev) +static void gpio_sysfs_free_irq(struct gpiod_data *data) { - struct gpiod_data *data =3D dev_get_drvdata(dev); struct gpio_desc *desc =3D data->desc; =20 CLASS(gpio_chip_guard, guard)(desc); @@ -278,12 +276,12 @@ static ssize_t edge_store(struct device *dev, struct = device_attribute *attr, return size; =20 if (data->irq_flags) - gpio_sysfs_free_irq(dev); + gpio_sysfs_free_irq(data); =20 if (!flags) return size; =20 - status =3D gpio_sysfs_request_irq(dev, flags); + status =3D gpio_sysfs_request_irq(data, flags); if (status) return status; =20 @@ -294,9 +292,8 @@ static ssize_t edge_store(struct device *dev, struct de= vice_attribute *attr, static DEVICE_ATTR_RW(edge); =20 /* Caller holds gpiod-data mutex. */ -static int gpio_sysfs_set_active_low(struct device *dev, int value) +static int gpio_sysfs_set_active_low(struct gpiod_data *data, int value) { - struct gpiod_data *data =3D dev_get_drvdata(dev); unsigned int flags =3D data->irq_flags; struct gpio_desc *desc =3D data->desc; int status =3D 0; @@ -309,8 +306,8 @@ static int gpio_sysfs_set_active_low(struct device *dev= , int value) /* reconfigure poll(2) support if enabled on one edge only */ if (flags =3D=3D GPIO_IRQF_TRIGGER_FALLING || flags =3D=3D GPIO_IRQF_TRIGGER_RISING) { - gpio_sysfs_free_irq(dev); - status =3D gpio_sysfs_request_irq(dev, flags); + gpio_sysfs_free_irq(data); + status =3D gpio_sysfs_request_irq(data, flags); } =20 gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_CONFIG); @@ -345,7 +342,7 @@ static ssize_t active_low_store(struct device *dev, =20 guard(mutex)(&data->mutex); =20 - return gpio_sysfs_set_active_low(dev, value) ?: size; + return gpio_sysfs_set_active_low(data, value) ?: size; } static DEVICE_ATTR_RW(active_low); =20 @@ -814,7 +811,7 @@ void gpiod_unexport(struct gpio_desc *desc) * edge_store. */ if (data->irq_flags) - gpio_sysfs_free_irq(dev); + gpio_sysfs_free_irq(data); } =20 put_device(dev); --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A369231848 for ; Mon, 23 Jun 2025 09:00:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669220; cv=none; b=ENPv1mHyM3+vojC97+znWBeaUeFI9SmhRrPL9PAqRrurBmEtuoM/gwxYQuVIEfhTOpX/OqBX5g3OEKilBEiy3KlfGSpP9LDEHGEde6IXW1ElMKy5LODS3BC7IADc2mZUe2p20IVh1XgPoc2+ESMouke3Es7eyOZpRUvc8mW2Jd4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669220; c=relaxed/simple; bh=d38zEk5ZaqdAay7/FyuW9ygn6cdXVn5igg9V9CUJrRU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kW4OZWxrbKMWVxibhFrmqdFxRTfLXTK80YmKjrbZgwDkGMHMVTF07RkBhDZ8h4w/yw0gUqMg2TyzA3nTe45QACeHafLPjHzwalQFy2UAc7foW1nPsIo4OZs41snrHXkO7eAYpBuaQSNH8hoRvq7NGv9pZ8LJnHxLV8XhSgmdNYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=f/sGyA8/; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="f/sGyA8/" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-453398e90e9so25377375e9.1 for ; Mon, 23 Jun 2025 02:00:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669217; x=1751274017; 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=AXrjLqYiHV1UqIkacQ78pU7saslEmRuVemdbUKcNXL0=; b=f/sGyA8/CsQtVGvG0DdPa3hfje8XpM/Iv7Gtw7g3W6B/z+ErcxBVru2h+cbzpaNEN0 GfyEuH7OtPqKEI1BbVKMXlcReQEWNwmUqsavo3o0hBAMKwEOcraYSKYlxgsf+SOuPUuM ZgLv2NIAT+SHPqBqBYvB2XgSGRyRQ7Rwbz7MyZ3qvaol4BYpv3V+SLAZxakpjpmjKc2u df7wsqvBAWHSk7veXk3vnAhcgXpuGhN6OwT1CY+/+QcY06/86NzPxtsbJIkGlDL3XvrZ gcrnCducLRDM62v9Rcq8rabpEPbNhtGRKstTR7/jJgR+J5LzqiS1wCd4QJHVA/DTe/Ux OFAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669217; x=1751274017; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AXrjLqYiHV1UqIkacQ78pU7saslEmRuVemdbUKcNXL0=; b=Df9vkWk+TqksBJady37RvgcJKhtoVG5G7ABqkVsCqvuT3xs13eExG5Ae0MwWp+i3jC 9/6T9RIZ+qre5IuU0/YNh5r16nQ0sMZoGu2SPEetKXTsab13wMZki67J81yV/tHvIXSE x9oFakY2cWvCyGaSgRQR1LSzWD5e/1bpEPQ7va8P46jnpFNXifKk/HxhT5e7O2wIq1dm 88kQYukWmNBE2HGdfDk5nsUxJU5uHlnLWF00DzkjRIlK37aQCoTJ53vRIAPC0UcO1D6n xSF9MJDkyzpXiyQk2RIsNDdL6JK3NRxMAakla/v+tL2PHadikCRic3xGioDaoHl7J7sd IajA== X-Forwarded-Encrypted: i=1; AJvYcCVGvW06JC97sMevMK5DuLh+1+vmJf8neHnWDT/fLcUsjjb0HQ7kzOlNMhyns+ARyxY3MsU0fkiwzckC7VM=@vger.kernel.org X-Gm-Message-State: AOJu0YxqB/JsPJHYl92cvcsUTthbY74iqbUhZ0PXLaARawvezVdTFJme P/zInMI824CEtwUcsWDS7VGZ7sv38nJMlHWTH13jonIdeAJ8sZcY1URpT6Gkv6akw4o= X-Gm-Gg: ASbGncv/tpHjtlghuNua+UU6Bs7U7h9UV7l7Q2BfGzMEXDif5wqjFpjOOIZL6YZlvWt PYK/8KFlbFGBUwJmTzSmWJNXMqS329BYMdEaTazjyIrCEeSAIx7ePQvqaQp1Gj0dMIyRWcEhj1d C/3pMOmIYbJ3bqiPm/F0mKs0zqqaFi0ylHJW9rsxZquDOUAruzFNv19X0p2lO+zXboERQY7gKfr kHW3DGnhKGhkuDwQyyJZwi2/xm2iYAMJC1X5ku76ue5bjqUMVBJ8MJbIziGka3g/eyVlkARwjKZ CTD1/datIVGGPiZPNsdSf9k0iyu+n382bZmmc3O5BzQLqeKazShJqKc= X-Google-Smtp-Source: AGHT+IFj1OCV8PRKybyL+z12L2wsuEmBhGyO6RABq1Km1Mn/ENvlckiiRHoM5umZFcF/EESy6kYBIA== X-Received: by 2002:a05:600c:4e8a:b0:450:d3b9:4b96 with SMTP id 5b1f17b1804b1-453659c9ca0mr96282455e9.13.1750669216650; Mon, 23 Jun 2025 02:00:16 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:15 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:52 +0200 Subject: [PATCH v2 4/9] gpio: sysfs: don't use driver data in sysfs callbacks for line attributes 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: <20250623-gpio-sysfs-chip-export-v2-4-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9621; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=R3AZXpoOp6EIWO/0eo1g3jnJMbaa3WsMdtY3unSTx9g=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReZarv//rd58fVHSACYfkVYYe+Vp7TEbJ+ot DOEdl0eeM2JAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmQAKCRARpy6gFHHX cvxeEACDnrZYIeBF6eByaDw8IjxxUYG0jdB0latSGDg8mSXvqlGzWjIlgXzoVkpPz0jr7Xk4NoK X2lK9PrdOObXpB8cXpYynfbZGiUoax/xIB7W7jzE2gC51exzblrVLOmf++vBAMLKI7pQFS+uQnu LfAU0bsomaHttZXoKPpto8a3Mg8RNZcYb2vlzljLrTrOvtEtuQSnTEV/eDFj+75B3Z1rLwp+R6s HikMt/1pUX0dld9nEgMvlgoT7n1YWDhVnh8vCu355IyvtCdrZUWrzk5G6tCYO2kym8Jd5Dv8+Yf ozdRFBPouXNl3NLzg7omsfsFzp1NkEgFcIoJNghmr82cArjhmQ4yzCLfQ7cgSBUT3XZkSOoU2l8 7Te5DbqlW0i3LkP7VLG9fc/1AD6Ux+Sa8/yqsCpxXEKObHUNnBTnrtYVJnjbrMyZgcwjrVTuTWM yNPplbXAXECld5YoStCHEHLf8X8YYv6qxGAuceMhLl1SOFiJTxYPQfJLyMlQr89xL2JUb5rfD5g ljKdwBaKrQSBUVOoYr3rAJxmi9q15NXuwUvtYSLllQlfvnTRljW6/Phfqj/kjUjS8k03deLDof4 kr+EgD1E8+EblB6y///vEqVFPTGwh6Jw3Ee8gu+/tzRd7GFROqR7j2xpEOv3O4pzb/z95Utz1Y/ qmCevso0ocfe1qg== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski Currently each exported GPIO is represented in sysfs as a separate class device. This allows us to simply use dev_get_drvdata() to retrieve the pointer passed to device_create_with_groups() from sysfs ops callbacks. However, we're preparing to add a parallel set of per-line sysfs attributes that will live inside the associated gpiochip group. They are not registered as class devices and so have the parent device passed as argument to their callbacks (the GPIO chip class device). Put the attribute structs inside the GPIO descriptor data and dereference the relevant ones using container_of() in the callbacks. This way, we'll be able to reuse the same code for both the legacy and new GPIO attributes. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/gpiolib-sysfs.c | 122 +++++++++++++++++++++++++++++----------= ---- 1 file changed, 82 insertions(+), 40 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 0e2c6b2d0940b1d4e4ad0a90aa172e7d01908969..2f1df2ceb7360200c718ea95089= 720ebfa5a513a 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -32,6 +32,15 @@ struct kernfs_node; #define GPIO_IRQF_TRIGGER_BOTH (GPIO_IRQF_TRIGGER_FALLING | \ GPIO_IRQF_TRIGGER_RISING) =20 +enum { + GPIO_SYSFS_LINE_ATTR_DIRECTION =3D 0, + GPIO_SYSFS_LINE_ATTR_VALUE, + GPIO_SYSFS_LINE_ATTR_EDGE, + GPIO_SYSFS_LINE_ATTR_ACTIVE_LOW, + GPIO_SYSFS_LINE_ATTR_SENTINEL, + GPIO_SYSFS_LINE_ATTR_SIZE, +}; + struct gpiod_data { struct gpio_desc *desc; =20 @@ -41,6 +50,14 @@ struct gpiod_data { unsigned char irq_flags; =20 bool direction_can_change; + + struct device_attribute dir_attr; + struct device_attribute val_attr; + struct device_attribute edge_attr; + struct device_attribute active_low_attr; + struct attribute *attrs[GPIO_SYSFS_LINE_ATTR_SIZE]; + struct attribute_group attr_group; + const struct attribute_group *attr_groups[2]; }; =20 struct gpiodev_data { @@ -79,7 +96,8 @@ static DEFINE_MUTEX(sysfs_lock); static ssize_t direction_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + dir_attr); struct gpio_desc *desc =3D data->desc; int value; =20 @@ -95,7 +113,8 @@ static ssize_t direction_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + dir_attr); struct gpio_desc *desc =3D data->desc; ssize_t status; =20 @@ -112,12 +131,12 @@ static ssize_t direction_store(struct device *dev, =20 return status ? : size; } -static DEVICE_ATTR_RW(direction); =20 static ssize_t value_show(struct device *dev, struct device_attribute *att= r, char *buf) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + val_attr); struct gpio_desc *desc =3D data->desc; ssize_t status; =20 @@ -133,7 +152,8 @@ static ssize_t value_show(struct device *dev, struct de= vice_attribute *attr, static ssize_t value_store(struct device *dev, struct device_attribute *at= tr, const char *buf, size_t size) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + val_attr); struct gpio_desc *desc =3D data->desc; ssize_t status; long value; @@ -150,7 +170,6 @@ static ssize_t value_store(struct device *dev, struct d= evice_attribute *attr, =20 return size; } -static DEVICE_ATTR_PREALLOC(value, S_IWUSR | S_IRUGO, value_show, value_st= ore); =20 static irqreturn_t gpio_sysfs_irq(int irq, void *priv) { @@ -247,7 +266,8 @@ static const char *const trigger_names[] =3D { static ssize_t edge_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + edge_attr); int flags; =20 scoped_guard(mutex, &data->mutex) @@ -262,7 +282,8 @@ static ssize_t edge_show(struct device *dev, struct dev= ice_attribute *attr, static ssize_t edge_store(struct device *dev, struct device_attribute *att= r, const char *buf, size_t size) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + edge_attr); ssize_t status =3D size; int flags; =20 @@ -289,7 +310,6 @@ static ssize_t edge_store(struct device *dev, struct de= vice_attribute *attr, =20 return size; } -static DEVICE_ATTR_RW(edge); =20 /* Caller holds gpiod-data mutex. */ static int gpio_sysfs_set_active_low(struct gpiod_data *data, int value) @@ -318,7 +338,8 @@ static int gpio_sysfs_set_active_low(struct gpiod_data = *data, int value) static ssize_t active_low_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + active_low_attr); struct gpio_desc *desc =3D data->desc; int value; =20 @@ -332,7 +353,8 @@ static ssize_t active_low_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - struct gpiod_data *data =3D dev_get_drvdata(dev); + struct gpiod_data *data =3D container_of(attr, struct gpiod_data, + active_low_attr); ssize_t status; long value; =20 @@ -344,48 +366,34 @@ static ssize_t active_low_store(struct device *dev, =20 return gpio_sysfs_set_active_low(data, value) ?: size; } -static DEVICE_ATTR_RW(active_low); =20 static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *att= r, int n) { - struct device *dev =3D kobj_to_dev(kobj); - struct gpiod_data *data =3D dev_get_drvdata(dev); - struct gpio_desc *desc =3D data->desc; + struct device_attribute *dev_attr =3D container_of(attr, + struct device_attribute, attr); umode_t mode =3D attr->mode; - bool show_direction =3D data->direction_can_change; + struct gpiod_data *data; =20 - if (attr =3D=3D &dev_attr_direction.attr) { - if (!show_direction) + if (strcmp(attr->name, "direction") =3D=3D 0) { + data =3D container_of(dev_attr, struct gpiod_data, dir_attr); + + if (!data->direction_can_change) mode =3D 0; - } else if (attr =3D=3D &dev_attr_edge.attr) { - if (gpiod_to_irq(desc) < 0) + } else if (strcmp(attr->name, "edge") =3D=3D 0) { + data =3D container_of(dev_attr, struct gpiod_data, edge_attr); + + if (gpiod_to_irq(data->desc) < 0) mode =3D 0; - if (!show_direction && test_bit(FLAG_IS_OUT, &desc->flags)) + + if (!data->direction_can_change && + test_bit(FLAG_IS_OUT, &data->desc->flags)) mode =3D 0; } =20 return mode; } =20 -static struct attribute *gpio_attrs[] =3D { - &dev_attr_direction.attr, - &dev_attr_edge.attr, - &dev_attr_value.attr, - &dev_attr_active_low.attr, - NULL, -}; - -static const struct attribute_group gpio_group =3D { - .attrs =3D gpio_attrs, - .is_visible =3D gpio_is_visible, -}; - -static const struct attribute_group *gpio_groups[] =3D { - &gpio_group, - NULL -}; - /* * /sys/class/gpio/gpiochipN/ * /base ... matching gpio_chip.base (N) @@ -645,6 +653,21 @@ gdev_get_data(struct gpio_device *gdev) __must_hold(&s= ysfs_lock) return dev_get_drvdata(cdev); }; =20 +static void gpiod_attr_init(struct device_attribute *dev_attr, const char = *name, + ssize_t (*show)(struct device *dev, + struct device_attribute *attr, + char *buf), + ssize_t (*store)(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count)) +{ + sysfs_attr_init(&dev_attr->attr); + dev_attr->attr.name =3D name; + dev_attr->attr.mode =3D 0644; + dev_attr->show =3D show; + dev_attr->store =3D store; +} + /** * gpiod_export - export a GPIO through sysfs * @desc: GPIO to make available, already requested @@ -664,6 +687,7 @@ gdev_get_data(struct gpio_device *gdev) __must_hold(&sy= sfs_lock) int gpiod_export(struct gpio_desc *desc, bool direction_may_change) { struct gpio_device *gdev; + struct attribute **attrs; struct gpiod_data *data; struct device *dev; int status; @@ -709,8 +733,26 @@ int gpiod_export(struct gpio_desc *desc, bool directio= n_may_change) else data->direction_can_change =3D false; =20 + gpiod_attr_init(&data->dir_attr, "direction", + direction_show, direction_store); + gpiod_attr_init(&data->val_attr, "value", value_show, value_store); + gpiod_attr_init(&data->edge_attr, "edge", edge_show, edge_store); + gpiod_attr_init(&data->active_low_attr, "active_low", + active_low_show, active_low_store); + + attrs =3D data->attrs; + data->attr_group.is_visible =3D gpio_is_visible; + attrs[GPIO_SYSFS_LINE_ATTR_DIRECTION] =3D &data->dir_attr.attr; + attrs[GPIO_SYSFS_LINE_ATTR_VALUE] =3D &data->val_attr.attr; + attrs[GPIO_SYSFS_LINE_ATTR_EDGE] =3D &data->edge_attr.attr; + attrs[GPIO_SYSFS_LINE_ATTR_ACTIVE_LOW] =3D + &data->active_low_attr.attr; + + data->attr_group.attrs =3D data->attrs; + data->attr_groups[0] =3D &data->attr_group; + dev =3D device_create_with_groups(&gpio_class, &gdev->dev, - MKDEV(0, 0), data, gpio_groups, + MKDEV(0, 0), data, data->attr_groups, "gpio%u", desc_to_gpio(desc)); if (IS_ERR(dev)) { status =3D PTR_ERR(dev); --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4F24233134 for ; Mon, 23 Jun 2025 09:00:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669221; cv=none; b=gUC70tLC+jvBj4Qb0arIBdyUEvyl8VkVlSL5ufxQwEK41hQ/WjST+gcMmYhDPbfoEHn5Vks0AhtMNqt9CX/bX07uJ8uPAc6+Rk2bvRUlrJAb6o3SJneb1HWoVK4BHB8l+O2anMb3ZdTy6Eg+xvfNqPEkoUbNwzj8Md8waXeAI8I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669221; c=relaxed/simple; bh=OcqJsEUM1xWbR2r6pQJTV9Hz2KFYFTWBL5RX6WgAeh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=m1NPSK/EWRib1JkgkUjYSlF4GtV7GliK7MKjhOHSQbAolr6IUO/f4kgyPyMAlenv57s5pkO3FRCujcXoJCw9ucBvugwWrT3hGkKpyEr4Yl8EZVmi2A+E2oEuzNqjN356qeAka4fRJrRW37SlVCxd6p67ZJA0aH6Zu7ldKow4lhY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=GFNF0qUG; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="GFNF0qUG" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-3a52874d593so3875429f8f.0 for ; Mon, 23 Jun 2025 02:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669218; x=1751274018; 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=l4Vor91tK66rCEdD8zNhQRyT2QrbuD1L1ZgU5UjDLa0=; b=GFNF0qUG8QS9CHsGb02CSYbsxVkilmtHw9x5b23JYnJY4mHSrL8XgZc+k6vkNePPGV OR0vIPkPM3sAYtzxZRImRBtZutAhHre2A1etiUXzYFHFKhJUDGaNsdBma9bB/MHXSjsu lNeg9r3Ars6I6FiVYoUK2ft9bR++ee9qpXYbVHmjv+2Mw9krURuxZVe1ZPwwZ0MKNGYw zkRCcn3YxW3xXIbmSpUigX15WomYUHT+P3RF6geAumNtn0Qgr25cyyRo8+DroLom8b+x +o6AV9dd7T/x07peBxkqXdp0+ntuJ/oazLUwe1bHrwORG95f16TYbCk5vF48zLwOi7Z2 8ZVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669218; x=1751274018; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l4Vor91tK66rCEdD8zNhQRyT2QrbuD1L1ZgU5UjDLa0=; b=TBXyj7iRatgQVWvOalyMaGzV1bPRzEVjc39w+h+eHMfPMUyQtp4srwB0Ka2qVedexs 0VSLUW4yZW7r1b2QT4/rwcdSjb+yPr0WvMn0jA5clG3ntKTGKzMNl/ZyboWEjGWzMO0j IfoE6IqQqQDZAQoEwzShY5cgXhHviRm2uvaMdGjgrV27vnVor3K4Xw4qz766CdPlVXQq WvUUETHufaaWcO/clS1APUxUaEhI140AvQ/569T+YWarUMlJdswqYQE2Kn9aud+S66Rf VB01l5IgSU9MuomtKL81pwSnH+TVPsdR1iJCvbkCe6QtY9OQ3yfNnDIsOHnxVBgLa2eQ 1+sQ== X-Forwarded-Encrypted: i=1; AJvYcCUjMfhspKujwLYQ2yrwp3IEFrkAxDKM06qHCKQ/JpTVC7ZYVAsN0OPqj167OCixRecVAyYvm1I1uG9NVAc=@vger.kernel.org X-Gm-Message-State: AOJu0Ywrs3wlygbdX5Z8VExdkBKqYDWd+0YbYk8Cn1C4gU8dppQAAxAW +ER4EtDV1UGP7+3xKOcm3Uq/glM5sOWfrf/9GbVCUR9GoAL/RgRd+UKv2xXIMKuqXGs= X-Gm-Gg: ASbGncv0ylDTlaZSKWhwD10fa6G3OacN+ma1ulYDs1Zu9SudS+Lzxrlnzs5Wzvx7ykC wYYv3sm93/RK227LukofXub9wfvnuaTNIkyEUIrQ9i/qwU+K/IMUoNNXkj+LkyeJr+BXjtpK14u x18h+6tDfVrx8vyNCDcG68R9hjL39w7CHLqMXhD4zmmVRYfeyDfyHOYz0yyQ12eijGwCuVSTlmP YfMK5fk6JPjWFsI1JDRWkvyUqdONQPz8bYrBWm3VPHIsAinAy8MlQsQD+NKLW88+fqxq7r6Wyi/ ljjmx2GZLN3dVv8GzmPilyjhpoJVa7nsWhSjz9gJqoAlAhqcOId23P0= X-Google-Smtp-Source: AGHT+IEssh8b+M/C5pOBKov3j6p5UuNMdQXCUzpb/c0+PD9r4n4tyHdOclgtkZgAmPRneHVDwFiyUw== X-Received: by 2002:a05:6000:210a:b0:3a5:2ef8:34f0 with SMTP id ffacd0b85a97d-3a6d12ded04mr6575267f8f.22.1750669218005; Mon, 23 Jun 2025 02:00:18 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:17 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:53 +0200 Subject: [PATCH v2 5/9] gpio: sysfs: rename the data variable in gpiod_(un)export() 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: <20250623-gpio-sysfs-chip-export-v2-5-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5053; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=O3iMdnAGNEOg5c/O2kjNy+wYU+YsFdH7aQx5YLYylI4=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReaLAPaPP5FpnqFOig4/0c+MPFs5mqraWG0Y WkUbQPj5B+JAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmgAKCRARpy6gFHHX csxeEACwLSFlUsuBLuBU+i83AAUODvYUfoO8eH/PcaeVfVQxVfsFSdoyUt3IZUU62TqoHYHh3c8 dmEsqV1jKegLLJmHGYHqFtphDRUxJtOeN26jKsBqHmM9hAuQLZ5OLniDAfQYzHECG/MVgw8791D 4drOXiqF7FIJfiQqEWmisERkv7S4M3K/MjCc1jnngyD11akcteLNEw0tClPJzklUwOF1cL2gZe4 DKjc9CAWQgvtJmVX9hPiPjnGhY9sUuMUdBHGXKzbSEns7z9qosMmkaMdKREZddKc3HnRfnXjkVR khk8a8c6duh+O01HRshAZxgOzDuj1P2nV0IV7ljkK793fY8baIRWaN1sF7rtGDtNjkVyxfET9kM 5QvEC8uOiIIgXYtXkLvAJ+lFz6d5cxZNuFEmq1K4A+72Kq7mP8HaVeTe/M4H8mp72JiFoBvOVhk XMgvUY9/uiMyIqGuzw68k8EnJCzuEGRrsbAaOtzGqV7jGRa3FL42Y/fO1wNmxPhKXCe6D51hKSe a3qk1CLDNaUHLgQkE9T5N6/tJA9oSmku9HLElr1NbdPan2alToa/vkd2W3rOVRjd/1YDgqZpztl cB10XbahMe7niQYEMuXW2qRuRe+4WzRcPLiMDk33HACKwrMWneye2S/5ObgP0UefX+8VS7sPkDd nDj8qWiw20btQyA== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski In preparation for future commits which will make use of descriptor AND GPIO-device data in the same functions rename the former from data to desc_data separately which will make future changes smaller and easier to read. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/gpiolib-sysfs.c | 63 ++++++++++++++++++++++------------------= ---- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 2f1df2ceb7360200c718ea95089720ebfa5a513a..515fd0d307cf820b036b1ea966b= 300715992359f 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -686,9 +686,9 @@ static void gpiod_attr_init(struct device_attribute *de= v_attr, const char *name, */ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) { + struct gpiod_data *desc_data; struct gpio_device *gdev; struct attribute **attrs; - struct gpiod_data *data; struct device *dev; int status; =20 @@ -720,47 +720,48 @@ int gpiod_export(struct gpio_desc *desc, bool directi= on_may_change) goto err_clear_bit; } =20 - data =3D kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) { + desc_data =3D kzalloc(sizeof(*desc_data), GFP_KERNEL); + if (!desc_data) { status =3D -ENOMEM; goto err_clear_bit; } =20 - data->desc =3D desc; - mutex_init(&data->mutex); + desc_data->desc =3D desc; + mutex_init(&desc_data->mutex); if (guard.gc->direction_input && guard.gc->direction_output) - data->direction_can_change =3D direction_may_change; + desc_data->direction_can_change =3D direction_may_change; else - data->direction_can_change =3D false; + desc_data->direction_can_change =3D false; =20 - gpiod_attr_init(&data->dir_attr, "direction", + gpiod_attr_init(&desc_data->dir_attr, "direction", direction_show, direction_store); - gpiod_attr_init(&data->val_attr, "value", value_show, value_store); - gpiod_attr_init(&data->edge_attr, "edge", edge_show, edge_store); - gpiod_attr_init(&data->active_low_attr, "active_low", - active_low_show, active_low_store); + gpiod_attr_init(&desc_data->val_attr, "value", value_show, value_store); + gpiod_attr_init(&desc_data->edge_attr, "edge", edge_show, edge_store); + gpiod_attr_init(&desc_data->active_low_attr, "active_low", + active_low_show, active_low_store); =20 - attrs =3D data->attrs; - data->attr_group.is_visible =3D gpio_is_visible; - attrs[GPIO_SYSFS_LINE_ATTR_DIRECTION] =3D &data->dir_attr.attr; - attrs[GPIO_SYSFS_LINE_ATTR_VALUE] =3D &data->val_attr.attr; - attrs[GPIO_SYSFS_LINE_ATTR_EDGE] =3D &data->edge_attr.attr; + attrs =3D desc_data->attrs; + desc_data->attr_group.is_visible =3D gpio_is_visible; + attrs[GPIO_SYSFS_LINE_ATTR_DIRECTION] =3D &desc_data->dir_attr.attr; + attrs[GPIO_SYSFS_LINE_ATTR_VALUE] =3D &desc_data->val_attr.attr; + attrs[GPIO_SYSFS_LINE_ATTR_EDGE] =3D &desc_data->edge_attr.attr; attrs[GPIO_SYSFS_LINE_ATTR_ACTIVE_LOW] =3D - &data->active_low_attr.attr; + &desc_data->active_low_attr.attr; =20 - data->attr_group.attrs =3D data->attrs; - data->attr_groups[0] =3D &data->attr_group; + desc_data->attr_group.attrs =3D desc_data->attrs; + desc_data->attr_groups[0] =3D &desc_data->attr_group; =20 dev =3D device_create_with_groups(&gpio_class, &gdev->dev, - MKDEV(0, 0), data, data->attr_groups, + MKDEV(0, 0), desc_data, + desc_data->attr_groups, "gpio%u", desc_to_gpio(desc)); if (IS_ERR(dev)) { status =3D PTR_ERR(dev); goto err_free_data; } =20 - data->value_class_node =3D sysfs_get_dirent(dev->kobj.sd, "value"); - if (!data->value_class_node) { + desc_data->value_class_node =3D sysfs_get_dirent(dev->kobj.sd, "value"); + if (!desc_data->value_class_node) { status =3D -ENODEV; goto err_unregister_device; } @@ -770,7 +771,7 @@ int gpiod_export(struct gpio_desc *desc, bool direction= _may_change) err_unregister_device: device_unregister(dev); err_free_data: - kfree(data); + kfree(desc_data); err_clear_bit: clear_bit(FLAG_EXPORT, &desc->flags); gpiod_dbg(desc, "%s: status %d\n", __func__, status); @@ -827,7 +828,7 @@ EXPORT_SYMBOL_GPL(gpiod_export_link); */ void gpiod_unexport(struct gpio_desc *desc) { - struct gpiod_data *data; + struct gpiod_data *desc_data; struct device *dev; =20 if (!desc) { @@ -843,22 +844,22 @@ void gpiod_unexport(struct gpio_desc *desc) if (!dev) return; =20 - data =3D dev_get_drvdata(dev); + desc_data =3D dev_get_drvdata(dev); clear_bit(FLAG_EXPORT, &desc->flags); - sysfs_put(data->value_class_node); + sysfs_put(desc_data->value_class_node); device_unregister(dev); =20 /* * Release irq after deregistration to prevent race with * edge_store. */ - if (data->irq_flags) - gpio_sysfs_free_irq(data); + if (desc_data->irq_flags) + gpio_sysfs_free_irq(desc_data); } =20 put_device(dev); - mutex_destroy(&data->mutex); - kfree(data); + mutex_destroy(&desc_data->mutex); + kfree(desc_data); } EXPORT_SYMBOL_GPL(gpiod_unexport); =20 --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D978A233D8E for ; Mon, 23 Jun 2025 09:00:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669222; cv=none; b=Z11WbNxeV6VauUwue+CiN3J6g3wjRmTFhWVxWb6agm9NkVvOIfadgQrbc7CTAyOEGRm2V7SzxhBSpwc1AtUFBlnzDcb48xVVo28qlzmoZVO5WO5cqKE5GQRnQp55vp32aTE0sEjIGDsQnOz3xfpBD+H5frEy85CCbcNAlXKqPrE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669222; c=relaxed/simple; bh=2VmufPqh0O8zob2k65E7xE6hRVRWUfbSQ0bsi4wykUg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EVhgIS9iYpZjIUxaWrdh/9X+r7uUW2OXG0+7nh0c0Yl7QY4S8ExGOCV6MSYv0pZnkSDIUsWYD5iu8LqJFwud1q5ohynsZ/4Yy+UNAsDzib2cBIWZSqVk0mdZmNV/aaz6T9959nUMC194/WcpkGCSwOTt15jYneS0t8/IEt1Dhes= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=JZQofE3w; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="JZQofE3w" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-3a57ae5cb17so2148422f8f.0 for ; Mon, 23 Jun 2025 02:00:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669219; x=1751274019; 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=S+0vM7w6nkRT64n1GtokbFb/+RihdtSIZj9Jo0wZAR4=; b=JZQofE3wn7nmP9NtwCUxp12LbKFEQek1YeFcOA9zdNu2xrD4arz2dLRN3lM80WAtEc gMgw4iAi9Hc/aHAIuRWBGlerdGO+7KOm8S16zRndzanHl7GyRxjYb2W22aM1KSXlSeGf 8wcQtviHrjuuAWRxw1pc1T4yrTgJhINFBkJTjPr0TWq5v80Q/RpzH6wMwnOVNcXyorYb 5QdqTyU6416ffwyjk9UEVdGvsbsxVIz0qXKMu0TQHNY3stw45/PNb9VBafy7OaWZJK4w lksJdjlIRXwaK6GgDNlmKICWbjVY6CJUOv45XI0D9w6GILx3+MbzcNlY14lavE43iMsL p0UA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669219; x=1751274019; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S+0vM7w6nkRT64n1GtokbFb/+RihdtSIZj9Jo0wZAR4=; b=oIQYndGelo8P3zNzjkupWmVdaATvLdFtapxWFp4ZwGb9Mnble/h6epyLMSi/L0y2Br yCe2ccRb3zDU5Xy2sOhlycflK+C+foxnlUKEDr1Cn3lloBJtZqFVfxfGAZAR1ytpm6lZ kEvy58sjjZka0g8JoItG2BgFbiMRObCXLafgFGjdCEHL5vATYKrg5onhpTeRE3QkYcMo vU7TjBOWJFd4K4E1gjZUul3S67vM/YlDbGy6BtRG51PN96ZS2xtH9dppJX/cnMnZpsWY q1S2FNyvkpjB/wuKyyu6npTVFgkBZZct2pK76tpQaYbasqLZyO12z1M5/wVqvi24GAWO v5jg== X-Forwarded-Encrypted: i=1; AJvYcCUZessjQTYONCSod8KYJlH841IgXvL7lU6ffQIKBJwmH7X6i4k/pJ9q5JoG9liv9bIVkfhtSlHriiy2Ftw=@vger.kernel.org X-Gm-Message-State: AOJu0YzlsSAdSHCcuR9g/nzn8+phUa40dIlSfseY/hdsVV4gGXpRqRUm XtNqWZ2Uobe1O0RHpZ+yS20Y0AuiP4qjSIYh9hupn3jI4r74FLu3XBNN8on5DF+RYXY= X-Gm-Gg: ASbGncvgDoGsW3IN/SmtVTdT8EumjNy8D1+5Rcv9SPYj5N4vVGcD4424GrqjbVTMfDF m9ZnShCXQ/F49MA7nvjfuBam15RHyRrn48CYdV8srgOPBSRd/BBGh0QVCu9Obxxe2eWhZCZRjFD rXBRO9hAR6YNRrzzFv4rwwguYXUrgepBdl7zuiuYSNQ9Uls2WgUbRLBJ/9QRN81dj8afyWvIdv1 3sWSwRaFh03wTcq15/VgVdWBEJpbD0iwg9xmoxqmQwMgTR2ffX+44A8Nx5fa5pt9aSOKqUof1DA rZGjQdQhFieepuv4wEjxit6M431qAcAmuZqP8B79h1MYlCe4akCepRU= X-Google-Smtp-Source: AGHT+IFaA00mQlzYeRtEKnzTDLTtco3gZtnGppI8xwcvEBY8Eay6CEe1tBFIEgHISAmJkVX3QY4cDQ== X-Received: by 2002:a05:6000:1a8f:b0:3a4:f52d:8b05 with SMTP id ffacd0b85a97d-3a6d12d5316mr10971030f8f.35.1750669219164; Mon, 23 Jun 2025 02:00:19 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:18 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:54 +0200 Subject: [PATCH v2 6/9] gpio: sysfs: don't look up exported lines as class devices 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: <20250623-gpio-sysfs-chip-export-v2-6-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4839; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=qH4qu97yZoN50VbMeaJJSPzOabP/6j28qPrt7PTU/qo=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWRealUcoRRY0OStafiz3dgD4Xi6PpbdP2Ydn7 5yVnpwrFFSJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmgAKCRARpy6gFHHX cgMpEACVlJ7OIqJln5Z9luPvKIw8+qN0RAyFHrmMPwFjT7tyyRoVcnTYKcg9OgbENdzKndXVHfr V33Vmj9PWFv4bXBoTvbBeKAE6a3uL6DJaHek5XMqER4o6AXOgcxgdgp0DDCuHw4mJLu+0CjOUxa sYfaRyW8T8rx4DMiW9JnxaVmsjmYorzhVY+Sib0aHQz39Tsv1NrmhFo2MgqFEYEBHLKYls3LIXu 9p0zlG6SXtkx+vMTLm4lwLOZRYNMfYbb1ktbkmkCZaP5e2wrSMrLkNS1KYKAI+34bCoZOnm6D+2 E6tp+Cn0bHj0IMl1oKDVwKBPUk2ViqQjDRbPE8G05Rm+368eNwEXbPx1B7R8MxUYsB8nEGmLX6k j+cQOV5eSg/9sMSDhHZIhSBAOmzY3H8aScjEjuNngVJ1qBLQtse0GP8eR9Tgtgt73x5YBq/1k/n RbXhyEr+w4hJgFLhCWzJT6V5adNUlqiq99iy7GeFrbfzIL+9+NTw8sFIIAeiFf/DH53uZTLCqj9 1xKN/lid9CzrBHZxGdTCrN7uiGVmrMSjEoXOA3t9pgr+wHuyxAUJ5XQzBQ9PplET2DBKMJ3Ttgg 1sRUxRnqP90dd06kaqAEvIDd0GBEfFkH4V4Lv99Rkhc3EmIRQbtDvG6brFH2xmqPv9F3V8CLGf9 u3N4L7L0fLHqfeQ== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski In preparation for adding a parallel, per-chip attribute group for exported GPIO lines, stop using class device APIs to refer to it in the code. When unregistering the chip, don't call class_find_device() but instead store exported lines in a linked list inside the GPIO chip data object and look it up there. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/gpiolib-sysfs.c | 60 ++++++++++++++++++++++++++++++++--------= ---- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 515fd0d307cf820b036b1ea966b300715992359f..adf030f74eb163f5d8b1092d004= 18b84354f923f 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -43,6 +43,7 @@ enum { =20 struct gpiod_data { struct gpio_desc *desc; + struct device *dev; =20 struct mutex mutex; struct kernfs_node *value_class_node; @@ -58,12 +59,15 @@ struct gpiod_data { struct attribute *attrs[GPIO_SYSFS_LINE_ATTR_SIZE]; struct attribute_group attr_group; const struct attribute_group *attr_groups[2]; + + struct list_head list; }; =20 struct gpiodev_data { struct gpio_device *gdev; struct device *cdev_base; /* Class device by GPIO base */ struct device *cdev_id; /* Class device by GPIO device ID */ + struct list_head exported_lines; }; =20 /* @@ -686,10 +690,10 @@ static void gpiod_attr_init(struct device_attribute *= dev_attr, const char *name, */ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) { + struct gpiodev_data *gdev_data; struct gpiod_data *desc_data; struct gpio_device *gdev; struct attribute **attrs; - struct device *dev; int status; =20 /* can't export until sysfs is available ... */ @@ -751,25 +755,40 @@ int gpiod_export(struct gpio_desc *desc, bool directi= on_may_change) desc_data->attr_group.attrs =3D desc_data->attrs; desc_data->attr_groups[0] =3D &desc_data->attr_group; =20 - dev =3D device_create_with_groups(&gpio_class, &gdev->dev, - MKDEV(0, 0), desc_data, - desc_data->attr_groups, - "gpio%u", desc_to_gpio(desc)); - if (IS_ERR(dev)) { - status =3D PTR_ERR(dev); + /* + * Note: we need to continue passing desc_data here as there's still + * at least one known user of gpiod_export_link() in the tree. This + * function still uses class_find_device() internally. + */ + desc_data->dev =3D device_create_with_groups(&gpio_class, &gdev->dev, + MKDEV(0, 0), desc_data, + desc_data->attr_groups, + "gpio%u", + desc_to_gpio(desc)); + if (IS_ERR(desc_data->dev)) { + status =3D PTR_ERR(desc_data->dev); goto err_free_data; } =20 - desc_data->value_class_node =3D sysfs_get_dirent(dev->kobj.sd, "value"); + desc_data->value_class_node =3D sysfs_get_dirent(desc_data->dev->kobj.sd, + "value"); if (!desc_data->value_class_node) { status =3D -ENODEV; goto err_unregister_device; } =20 + gdev_data =3D gdev_get_data(gdev); + if (!gdev_data) { + status =3D -ENODEV; + goto err_unregister_device; + } + + list_add(&desc_data->list, &gdev_data->exported_lines); + return 0; =20 err_unregister_device: - device_unregister(dev); + device_unregister(desc_data->dev); err_free_data: kfree(desc_data); err_clear_bit: @@ -828,8 +847,9 @@ EXPORT_SYMBOL_GPL(gpiod_export_link); */ void gpiod_unexport(struct gpio_desc *desc) { - struct gpiod_data *desc_data; - struct device *dev; + struct gpiod_data *desc_data =3D NULL; + struct gpiodev_data *gdev_data; + struct gpio_device *gdev; =20 if (!desc) { pr_warn("%s: invalid GPIO\n", __func__); @@ -840,14 +860,22 @@ void gpiod_unexport(struct gpio_desc *desc) if (!test_bit(FLAG_EXPORT, &desc->flags)) return; =20 - dev =3D class_find_device(&gpio_class, NULL, desc, match_export); - if (!dev) + gdev =3D gpiod_to_gpio_device(desc); + gdev_data =3D gdev_get_data(gdev); + if (!gdev_data) return; =20 - desc_data =3D dev_get_drvdata(dev); + list_for_each_entry(desc_data, &gdev_data->exported_lines, list) + if (desc =3D=3D desc_data->desc) + break; + + if (!desc_data) + return; + + list_del(&desc_data->list); clear_bit(FLAG_EXPORT, &desc->flags); sysfs_put(desc_data->value_class_node); - device_unregister(dev); + device_unregister(desc_data->dev); =20 /* * Release irq after deregistration to prevent race with @@ -857,7 +885,6 @@ void gpiod_unexport(struct gpio_desc *desc) gpio_sysfs_free_irq(desc_data); } =20 - put_device(dev); mutex_destroy(&desc_data->mutex); kfree(desc_data); } @@ -899,6 +926,7 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) return -ENOMEM; =20 data->gdev =3D gdev; + INIT_LIST_HEAD(&data->exported_lines); =20 guard(mutex)(&sysfs_lock); =20 --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1697723643E for ; Mon, 23 Jun 2025 09:00:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669223; cv=none; b=bYDIbUPBcvyR6BwHOLAkjO649nXe2VxQBSqOfd3WfwleeKLO6nqIzrW+Wyjua4m/5jG5jRY2vk0FK3RMJbWvlRd7Dsi/Hsy/F+FkAdp+gocsZd6NPYc+ANBbzhxW+6K3zxHqTaZ7VQseuCE+gfz/14b7as9qU6w9/FBjAwQs6GU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669223; c=relaxed/simple; bh=qhXKR5mSbv8ApDx6/W5MMvt+Akaan9xh97RBCcLaYwY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sB9FQyQ2GxyCsAG+e/6XxAAhlpfK8B9zj83Rzpk1/eJ+5DCxLCKUFLmtnXuJOoQuQFYrbzx5XYBUh71+EGJ22mR7XLoQ4HZ1laPRHQRy4bZeEwPiocKOEyRcSYTq5kyhNPO50VJlC3VJ8ZJlIrl8iW+XKREqt3DLi0vXTysj0Uk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=R5COwnhi; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="R5COwnhi" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-453643020bdso22316865e9.1 for ; Mon, 23 Jun 2025 02:00:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669220; x=1751274020; 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=xE1x+VGK8VPIQVNQvYqCI6uexl0lL7Kq5+Z/LW/Baew=; b=R5COwnhiJwCtOzD+YtoXh7dBflX25mjuJSBzP1gLJzTc7o/EiD5W17EZpCP9hYVh77 nKTeyzQo2ezjiRMRH+odN5YpzEH5XuIbsyAB7xhTboJCGkSzTIobpOSm41/mASfNpWJD i5uJa06APRHdAIYwUZJ9COYX7Gcpci2txuSxi+FtVwTbX3hTPbjdTCHVfEgTPWrYBnTa cFL8txC5roFaXWKdpUYEOyvDyaz8DcRNvLGaEwu2cciFkMdiDr9vvyuYN5OitlLF8v2X gfXc8wv8W5UnjJU4fEMy737Q8fvRhGHan4ySENESSWC6v8CqJnVg4l+9489ITgl5DndS vvPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669220; x=1751274020; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xE1x+VGK8VPIQVNQvYqCI6uexl0lL7Kq5+Z/LW/Baew=; b=lWY7TL3ucDtSo1Z7B2FlSl6IbeEM0P8sF4dOvun7QBIvvs3x9LRVlqCWbb0KUgF7kG x184/+tTJzBtYkRMxhj51VKwDyATQCxUB1ABhYuD3qmukx9GMKURc5nRKaOnpW/CNDYZ mUZnDHTodtbR39AvAAzTM60ty1/q9pmvE3cy9CKWRLRQYFEh4/p5LVxGT8E5xZd5dJNp DOWvp5R9O1Qg+JMM8zoA2bA8q/XhcMUmIox4rEx0VYvZ1MnfstD1Ht+WLdYyDTg/ZcrS RpNWLwT3qIvyDvZwJ4/vlhEP51qadUuox/zGraWYv7EeA7zCkm5b9/hII9+nKzl4Ue5v AQAw== X-Forwarded-Encrypted: i=1; AJvYcCUeq5tF6hapw9egF7gsq5cg9Hdx96e4Uj3O56GGCo27HXhewcZDBJn/S5UuU73FEDTyuQC8wt3uEh8rvGY=@vger.kernel.org X-Gm-Message-State: AOJu0YxKGOVyEnOdmLr4bmNpSmA0auw1i2n4zjM+JOJ9wHqyBnFHPBkA lTIKnR6yD2DT8l1/r4JlNuxp19ZgzoplaT8jKT048pGtx/8W23TK2u7rLX4gJu9EqeY= X-Gm-Gg: ASbGncuYXEpqTl2pLI83Rlc2FWgIpieD7poAMEwRRa87i1+A/7Ncms7FRZMG7siwIer Im7U/iBN/CFIiHSHdWXvsdUdw09jA0hKT6l7o10YzXgPMGI2QbcpKsuEgFzEBZbCU8LO6zktbwG 9RMNh8E7oNr8xdwtYlAWllQCChn+XE9QQ+kCaCZAA4nJNAS9NTOthT7sGcvErW2KFsfmc9CE4rX pXvgZilPFHBTH3lBWeZIjtmiKMNqT2NntHgT7d5QYNUI4BAJnAbqjgU1qlFScNjdAgZ6lD9mynF iEsUJStDPtFBkt7YuB3VCDTVFclWk2DycQXmnLaPfFXoeksnHuTund4= X-Google-Smtp-Source: AGHT+IGyfl6XgfHw/Z/xgUn3ZCFhcTWnEk0s+22gzMu/4rZrmNBRzdVL7I4XCSMLxBzyPQe8+rqvXg== X-Received: by 2002:a05:600c:1989:b0:450:d00d:d0 with SMTP id 5b1f17b1804b1-453659dd7e8mr91864485e9.19.1750669220441; Mon, 23 Jun 2025 02:00:20 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:19 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:55 +0200 Subject: [PATCH v2 7/9] gpio: sysfs: export the GPIO directory locally in the gpiochip directory 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: <20250623-gpio-sysfs-chip-export-v2-7-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4015; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=69h/lz9me1gz3hK9nMhFDYUeePtna8eHSBEPbFHyXuU=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReakhUNrQOuwA6fsapAuNzYerJ9SF+SiJIU3 4yl6OQP+8mJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmgAKCRARpy6gFHHX cloiD/94FDSiH3pAS0d9z4rgM3FSjbNQk7PiJ3Xwo73Orh4R4PYIWRIw7/KAOHxO45xqh6uVWG7 pHAJpSmkWjKbC9T7TVljGgO7uJiHZ/WtJyVQ9PvNI9Pd8ePYs5pmedsoJPLtMtS9MJogMqbIQuw IMZzRUTaq148sYRR8NBPD4dV0gfv62+k4QnXNNJLnfCpHpO/QftaM0i2/DQuzSNPaE8VbO2d0R9 HF2Eqy/WKak1js6H7fiyzbpAangiyroE3hMo2XmeEoL0Dcx4xEkNOhKhNJFP1Z9RgKb6dRr5qVq rHLz/mfE2SbWlGRu7dI9r2fndvDLGyng/25hop9deTcHNqCLaspiS44raOrorMxUl7wrOQLVXq8 JhqiSaeoRB7miO8PGSEFwYJtpAYe4xYNh78ZxpK+mEV3IYgBPuIT3Og83Qnm+FaZIIFxvdLEkML XvsZPA+LBVbQJ9Cd2MzRF6boCjA8U9LkSKQDlQKx/VL7E1Is8Ky9kHiO61RxjMc+azb5TSXC1S0 rjsNzSPu2tbfahV3/ip+JjxNbA3AXl+425QlouupxpklPSlKfbh8IhBA9Qi28OZCNc9ZiEZFegO e5OreYmEmqNq5j9ytvc8hzfh5mjRxHyjrmH5VO+BULix7vwbLBnD2H/UC+mUokgR0jMPlWmUQVo 7WzQ0Dqe/06VxxA== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski As a way to allow the user-space to stop referring to GPIOs by their global numbers, introduce a parallel group of line attributes for exported GPIO that live inside the GPIO chip class device and are referred to by their HW offset within their parent chip. Signed-off-by: Bartosz Golaszewski --- Documentation/ABI/obsolete/sysfs-gpio | 5 +++++ drivers/gpio/gpiolib-sysfs.c | 40 +++++++++++++++++++++++++++++++= +++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/obsolete/sysfs-gpio b/Documentation/ABI/obso= lete/sysfs-gpio index ff694708a3bef787afa42dedf94faf209c44dbf0..c0bb51412a912cefe032c4e8428= 8f99754acb1b5 100644 --- a/Documentation/ABI/obsolete/sysfs-gpio +++ b/Documentation/ABI/obsolete/sysfs-gpio @@ -27,6 +27,11 @@ Description: /base ... (r/o) same as N /label ... (r/o) descriptive chip name /ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1) + /gpio + /value ... always readable, writes fail for input GPIOs + /direction ... r/w as: in, out (default low); write: high, low + /edge ... r/w as: none, falling, rising, both + /active-low ... r/w as: 0, 1 /chipX ... for each gpiochip; #X is the gpio device ID /export ... asks the kernel to export a GPIO at HW offset X to usersp= ace /unexport ... to return a GPIO at HW offset X to the kernel diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index adf030f74eb163f5d8b1092d00418b84354f923f..37d58009a51333f7d6a8d600dbe= aeb333df27ac3 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -47,11 +47,13 @@ struct gpiod_data { =20 struct mutex mutex; struct kernfs_node *value_class_node; + struct kernfs_node *value_chip_node; int irq; unsigned char irq_flags; =20 bool direction_can_change; =20 + struct kobject *parent; struct device_attribute dir_attr; struct device_attribute val_attr; struct device_attribute edge_attr; @@ -180,6 +182,7 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv) struct gpiod_data *data =3D priv; =20 sysfs_notify_dirent(data->value_class_node); + kernfs_notify(data->value_chip_node); =20 return IRQ_HANDLED; } @@ -780,13 +783,46 @@ int gpiod_export(struct gpio_desc *desc, bool directi= on_may_change) gdev_data =3D gdev_get_data(gdev); if (!gdev_data) { status =3D -ENODEV; - goto err_unregister_device; + goto err_put_dirent; } =20 list_add(&desc_data->list, &gdev_data->exported_lines); =20 + desc_data->attr_group.name =3D kasprintf(GFP_KERNEL, "gpio%u", + gpio_chip_hwgpio(desc)); + if (!desc_data->attr_group.name) { + status =3D -ENOMEM; + goto err_put_dirent; + } + + desc_data->parent =3D &gdev_data->cdev_id->kobj; + status =3D sysfs_create_groups(desc_data->parent, + desc_data->attr_groups); + if (status) + goto err_free_name; + + char *path __free(kfree) =3D kasprintf(GFP_KERNEL, "gpio%u/value", + gpio_chip_hwgpio(desc)); + if (!path) { + status =3D -ENOMEM; + goto err_remove_groups; + } + + desc_data->value_chip_node =3D kernfs_walk_and_get(desc_data->parent->sd, + path); + if (!desc_data->value_chip_node) { + status =3D -ENODEV; + goto err_remove_groups; + } + return 0; =20 +err_remove_groups: + sysfs_remove_groups(desc_data->parent, desc_data->attr_groups); +err_free_name: + kfree(desc_data->attr_group.name); +err_put_dirent: + sysfs_put(desc_data->value_class_node); err_unregister_device: device_unregister(desc_data->dev); err_free_data: @@ -876,6 +912,8 @@ void gpiod_unexport(struct gpio_desc *desc) clear_bit(FLAG_EXPORT, &desc->flags); sysfs_put(desc_data->value_class_node); device_unregister(desc_data->dev); + sysfs_remove_groups(desc_data->parent, desc_data->attr_groups); + kernfs_put(desc_data->value_chip_node); =20 /* * Release irq after deregistration to prevent race with --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DDFC1E231F for ; Mon, 23 Jun 2025 09:00:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669225; cv=none; b=KSnNuHeul1V0VuMovrOG7cARQrBn49AqqGOkiZ51MfpL1e2umkqu5W6zG1i0/WTSX+Aj3R4ghPRNvOeYXJq+lCk28CpQrlSAGPbGNXz8UwKBn/6KlCnNnz3FRcJimOas8sGki68YHwB6qYlrQKJ86bZegr141tN/y4UhP8kI140= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669225; c=relaxed/simple; bh=jRBfjkpecc9BUW1w81pSTZlb8j2BdRorFxrrJ6koHpw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XhckgHJw9V92/I3wlhf8NcxvdxwbVKtU591C/HwVUX+KVSwdiUnLFQnhVDRUY0ML0jBAURKRRLOBpJptAwewVkX/CqY5+Ac5lR9K33TdcYxej8RqJy+FuY1yRtjRykSoc4xjsMhTxvwRXHbkmyk9gp+ANYYllD0ElpvBLbQ2c70= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=jKMP58tT; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="jKMP58tT" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-453643020bdso22317085e9.1 for ; Mon, 23 Jun 2025 02:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669222; x=1751274022; 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=qiPiKKgelJK0MgrvfIW+YyEedIQhhH0ktmAiH+T8Zkw=; b=jKMP58tTW4gAzixhYCFhL8n0PH+IYJ2kiqK/1VdpQq84/PcGVgCe9tX8kx2TA4Fjz+ 4EcB+HxpoQBsgIA6ZCsN7Oo8M+0PK/rSK1Lr9urlB2rQelaYOV110XjB/2nDLWhNKPy+ BeW3Xnbi/z4zPqg8awTI/TqpJtv8B9easK4nSHsi2WLsxZ3osFYdYIdfouWeu+hCQNP4 fu5z6jT9M8YboEoCVl60rS47JOA5UCzzO75DReItcEaMipJaByHdK6nBi9csVfNxL7ik 6V6npEv3mGUH6kU++pE3jIgIQsGCRmtuFkpW967vVkgmHN7McdA8CwwF/hLTc6mRkAf0 JvyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669222; x=1751274022; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qiPiKKgelJK0MgrvfIW+YyEedIQhhH0ktmAiH+T8Zkw=; b=s+yR54QnE3BE5j9UPlt8TDOV7l4bi4at5KX93paWYpoRzAdeINJPRMewGAtx7WOa4o L74P/xMRF95LtdNVDHzTDoJibBhb01Kl5qtKGKGgvDhAkD2ebJZbl6vbx3ZT8YAZQTDv iKPZBJPyjLyzsEhtkty6FF2eOlUHDsUHZXMSGdup+sVN8H0uzCo3qAzFqJbm0quTmcOu JSFbyHxz2BnaymFNR+fCMWvPpJZB/17q2lJ0mvWOuiaCQzNMAqv6ouyOYv9en7pyMwo7 zRPIjtKrEvfJpwTKHLz8N3KwG7LVII+wlhT1tzLHOHqpMjqAGNUKL8MaPsgV6HJmcH6O niEg== X-Forwarded-Encrypted: i=1; AJvYcCUFC5BVt2WgkhbSorR4YP3AFTgIBSqXEIzq1CSVDSHft9hUlGQUJ1TkEaqSvlYE/YTA2hPL2w2wb9pqipA=@vger.kernel.org X-Gm-Message-State: AOJu0YzaGJJOhJ+dlxxcCc87+u/33JuVir1z1ac1zhNqNDhvsYnrl8g1 YWQg5c+wHhXVobFqrJcn7tCx+3NmymCXcy+pr3xySYyXseATyL39EheTMbZHICWLk3Q= X-Gm-Gg: ASbGncs/SxBZ6RbGuXU5MPOX7gjKaZEXj0roJO3RAdUmkZxw4UbMyVWrWgne1kRU+Ss zqqQ3W9ACA+b70nf0Bq/1ahtSnU82gcWubOIbGnSUvl5Z/KFTbCYFpcaDZIXeU5iIaS/e05CW2+ kBcnRSYxafhb9hD4TVGS4SLAMVz/m+Xfv6e5eZsVYEnIv7t2Eu0M3YFw1wN62tNhvWrvhIquuMo RD62kXwu6Gk1ltkO4ZPwArHJxRca5vO9IWHgTDXwEX3Rm2xnnQz0vNQbN3nMGJQ9/uESWTxWgC1 op5ReQbowuExonVaaL+ka97h7N7zNmQS5UbX/fJyJMCqNAjY1aMMYDg= X-Google-Smtp-Source: AGHT+IFtsMKXylZBqwYZ6g2XtKGhJ+AdwXOnqsW9qIXy8SogYsUsVo1AlQk5Zr067rnb18l7OgtGOg== X-Received: by 2002:a05:600c:4fc5:b0:442:e03b:58a9 with SMTP id 5b1f17b1804b1-453659edd23mr96036445e9.25.1750669221517; Mon, 23 Jun 2025 02:00:21 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:20 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:56 +0200 Subject: [PATCH v2 8/9] gpio: sysfs: allow disabling the legacy parts of the GPIO sysfs interface 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: <20250623-gpio-sysfs-chip-export-v2-8-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8023; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=2di3W2yHM6i5t7LwlUeew0hS2H4VmaMxC0/5eiN8mL0=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWReaRzZCBOEPZ+cr1jQF9rq/zdO1N7t39cpCp /lw3/F3eQ6JAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmgAKCRARpy6gFHHX cuJQD/9CRL6ndRy7Z43UUrz4mA1YKdV5BbivNqpcdvytQgmNpXEgdXg9je6ot436b/H0ivUd+ZJ y0EDUN0bGezYbKp6Cs4XurE/x/ZlhVqvD8rRPEGioP7xhVXtVonGmnAPw2CUdMzQX8bTwTNZuzu ZdHxQ/6MYI95+g7r/yRAuJdfb+JflNLRU7DzJ5gINmqjwLEmkGnm6bUf2XaifWMAhE46AlzKSz0 H6MDQAmo/X41nb1uj1muSNWvsZhtUJ1ahcRJx0ZFE9VdKq3zv/YOLYQplhFJ/RsMtlXam1tQifN TkAngA5CB0hG5UGGwyrpBGPLqCpRQBl2IVmmNo49AiJ/W/dUU/upKWpSckZlsXV9uYZYfKxrkI3 5m7mGfrsCUDc6uUfc7Sf1PNzJ5vQ9jeMPRbgSs3R6kbAeE+NjhQ12nzTO6mEOPvWb3C2NLWtLug 9qnauv6FI7kHdSVXXZ6ovyHz8vKRPMTtVGDalh0vgoBsA7Jo03hzUjYoHdGr5cZzpE+cbW1l/3f zrVAHd+WKHUFS6MZH5IB4K7tqpClcXySD6rbLpbGb4J24drF3oZpVkFhNa1FAWBxv/GZ/blKlYS GaWfEM+ol316qWXYXfAUt8+3U7Lrku3L2H5dlPcOO0Z+v+ns75QH2q9Ei8sYFzO8Z6oatgqy4it /+1hiEFCF1zkHgA== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski Add a Kconfig switch allowing to disable the legacy parts of the GPIO sysfs interface. This means that even though we keep the /sys/class/gpio/ directory, it no longer contains the global export/unexport attribute pair (instead, the user should use the per-chip export/unpexport) nor the gpiochip$BASE entries. This option default to y if GPIO sysfs is enabled but we'll default it to n at some point in the future. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/Kconfig | 8 ++++++++ drivers/gpio/gpiolib-sysfs.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 44f922e10db2f8dcbdacf79ccd27b0fd9cd93564..d040fdd95ee4b19851057fbedbb= 023f277149c9c 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -69,6 +69,14 @@ config GPIO_SYSFS use the character device /dev/gpiochipN with the appropriate ioctl() operations instead. =20 +config GPIO_SYSFS_LEGACY + bool "Enable legacy functionalities of the sysfs interface" + depends on GPIO_SYSFS + default y if GPIO_SYSFS + help + Say Y here if you want to enable the legacy, global GPIO + numberspace-based functionalities of the sysfs interface. + config GPIO_CDEV bool "Character device (/dev/gpiochipN) support" if EXPERT default y diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 37d58009a51333f7d6a8d600dbeaeb333df27ac3..0e7605fee3bd9edbe4e90d8e466= 742df11a8d579 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -46,7 +46,9 @@ struct gpiod_data { struct device *dev; =20 struct mutex mutex; +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) struct kernfs_node *value_class_node; +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ struct kernfs_node *value_chip_node; int irq; unsigned char irq_flags; @@ -67,7 +69,9 @@ struct gpiod_data { =20 struct gpiodev_data { struct gpio_device *gdev; +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) struct device *cdev_base; /* Class device by GPIO base */ +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ struct device *cdev_id; /* Class device by GPIO device ID */ struct list_head exported_lines; }; @@ -181,7 +185,9 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv) { struct gpiod_data *data =3D priv; =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) sysfs_notify_dirent(data->value_class_node); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ kernfs_notify(data->value_chip_node); =20 return IRQ_HANDLED; @@ -416,6 +422,7 @@ static umode_t gpio_is_visible(struct kobject *kobj, st= ruct attribute *attr, * /ngpio ... matching gpio_chip.ngpio */ =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) static ssize_t base_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -424,6 +431,7 @@ static ssize_t base_show(struct device *dev, struct dev= ice_attribute *attr, return sysfs_emit(buf, "%u\n", data->gdev->base); } static DEVICE_ATTR_RO(base); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 static ssize_t label_show(struct device *dev, struct device_attribute *att= r, char *buf) @@ -548,6 +556,7 @@ static struct device_attribute dev_attr_unexport =3D __= ATTR(unexport, 0200, NULL, chip_unexport_store); =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) static struct attribute *gpiochip_attrs[] =3D { &dev_attr_base.attr, &dev_attr_label.attr, @@ -555,6 +564,7 @@ static struct attribute *gpiochip_attrs[] =3D { NULL, }; ATTRIBUTE_GROUPS(gpiochip); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 static struct attribute *gpiochip_ext_attrs[] =3D { &dev_attr_label.attr, @@ -565,6 +575,7 @@ static struct attribute *gpiochip_ext_attrs[] =3D { }; ATTRIBUTE_GROUPS(gpiochip_ext); =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) /* * /sys/class/gpio/export ... write-only * integer N ... number of GPIO to export (full access) @@ -629,10 +640,13 @@ static struct attribute *gpio_class_attrs[] =3D { NULL, }; ATTRIBUTE_GROUPS(gpio_class); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 static const struct class gpio_class =3D { .name =3D "gpio", +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) .class_groups =3D gpio_class_groups, +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ }; =20 static int match_gdev(struct device *dev, const void *desc) @@ -763,6 +777,7 @@ int gpiod_export(struct gpio_desc *desc, bool direction= _may_change) * at least one known user of gpiod_export_link() in the tree. This * function still uses class_find_device() internally. */ +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) desc_data->dev =3D device_create_with_groups(&gpio_class, &gdev->dev, MKDEV(0, 0), desc_data, desc_data->attr_groups, @@ -779,6 +794,7 @@ int gpiod_export(struct gpio_desc *desc, bool direction= _may_change) status =3D -ENODEV; goto err_unregister_device; } +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 gdev_data =3D gdev_get_data(gdev); if (!gdev_data) { @@ -822,10 +838,12 @@ int gpiod_export(struct gpio_desc *desc, bool directi= on_may_change) err_free_name: kfree(desc_data->attr_group.name); err_put_dirent: +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) sysfs_put(desc_data->value_class_node); err_unregister_device: device_unregister(desc_data->dev); err_free_data: +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ kfree(desc_data); err_clear_bit: clear_bit(FLAG_EXPORT, &desc->flags); @@ -834,12 +852,14 @@ int gpiod_export(struct gpio_desc *desc, bool directi= on_may_change) } EXPORT_SYMBOL_GPL(gpiod_export); =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) static int match_export(struct device *dev, const void *desc) { struct gpiod_data *data =3D dev_get_drvdata(dev); =20 return data->desc =3D=3D desc; } +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 /** * gpiod_export_link - create a sysfs link to an exported GPIO node @@ -856,6 +876,7 @@ static int match_export(struct device *dev, const void = *desc) int gpiod_export_link(struct device *dev, const char *name, struct gpio_desc *desc) { +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) struct device *cdev; int ret; =20 @@ -872,6 +893,9 @@ int gpiod_export_link(struct device *dev, const char *n= ame, put_device(cdev); =20 return ret; +#else + return -EOPNOTSUPP; +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ } EXPORT_SYMBOL_GPL(gpiod_export_link); =20 @@ -910,8 +934,10 @@ void gpiod_unexport(struct gpio_desc *desc) =20 list_del(&desc_data->list); clear_bit(FLAG_EXPORT, &desc->flags); +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) sysfs_put(desc_data->value_class_node); device_unregister(desc_data->dev); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ sysfs_remove_groups(desc_data->parent, desc_data->attr_groups); kernfs_put(desc_data->value_chip_node); =20 @@ -968,6 +994,7 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) =20 guard(mutex)(&sysfs_lock); =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) /* use chip->base for the ID; it's already known to be unique */ data->cdev_base =3D device_create_with_groups(&gpio_class, parent, MKDEV(0, 0), data, @@ -979,13 +1006,16 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) kfree(data); return err; } +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ =20 data->cdev_id =3D device_create_with_groups(&gpio_class, parent, MKDEV(0, 0), data, gpiochip_ext_groups, "chip%d", gdev->id); if (IS_ERR(data->cdev_id)) { +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) device_unregister(data->cdev_base); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ kfree(data); return PTR_ERR(data->cdev_id); } @@ -1004,7 +1034,9 @@ void gpiochip_sysfs_unregister(struct gpio_device *gd= ev) if (!data) return; =20 +#if IS_ENABLED(CONFIG_GPIO_SYSFS_LEGACY) device_unregister(data->cdev_base); +#endif /* CONFIG_GPIO_SYSFS_LEGACY */ device_unregister(data->cdev_id); kfree(data); } --=20 2.48.1 From nobody Wed Oct 8 23:42:48 2025 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D86C4238C1D for ; Mon, 23 Jun 2025 09:00:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669226; cv=none; b=tYwbMOJm50spRBJ6CLaAVNQD+zxpwe8T+hvrxp6WqtZkjfJb3Mpyw9sxcmz0XpNyjpsiZiEKhpUkqdrcqGQlmZLi7a34PJB9DNb56LOj0eQmh9r5MqpkpwARBUodoPK2x7EDCLIacDTBQpcdH8Qio6pcn/wylDaj/CN3F36cHoQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750669226; c=relaxed/simple; bh=qKH/Xx/gFP86G5ibgMZ3u7lxWPymmr9dQIqXb3a5NY0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u4jduIG0ssWtC4aCz4i7FeI4zSLWXSG0vj9KHirVep9AKE3vwv5DbEAbgeJM0fZuUDlxiAtWa+UteYaA5xZ0pCqnLBbajPx0GRMOEsEGxTTHRmqD60GV7/WPMzsd4XSP1xK+ZBck++ZWvSTJZMj5ueQ+7fuG1sXGwVb5ECl+lug= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=oYzRPtHO; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="oYzRPtHO" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-3a548a73ff2so3629504f8f.0 for ; Mon, 23 Jun 2025 02:00:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1750669223; x=1751274023; 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=Tm+AP9yf/4s1zahGdn4RMNsFWWCbX0hdSX+OspH82js=; b=oYzRPtHOP0GNN0/+iFQFvgTjRtzxPhJ25MixrjAo3ZYiQmy/f8KamSmRdePAwEGVxu BpCW/G4M2Zpysy8sisbLHPHXPw1+2HWwu8SEnx+bU3b1y5jIzaxP8K4KyavdJLzxPQSz Upo90h/dnQ9itqNtS3/5xSYkFMeOacR9BHNtr2eU4INH3JxoXuSVvC8zZxUksY7uu7kd AQXffQ9bcwhjdbK+6BRSZyl0cLJ/Lp90pGLm5DJICiVy+t0BD/IKbm5c8dKm4IG28MOf mI04rJYf89Fxfq5nbmsNp0JJ4NkZejd3iOqvKvGErbaNKOa62O/TWRWhDZzp+YS8fbIt 6UBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750669223; x=1751274023; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Tm+AP9yf/4s1zahGdn4RMNsFWWCbX0hdSX+OspH82js=; b=MkgECNp2yRb/qZcsZBJmISaiziJIdZoCdU6wfU3SRbdFgx58a7VsElQiI2dc0tmazi KpU+kCstPMbinq8Xbwr9Ef6QHgAILmmyPGtpnnnKjlVUpYDlr8hp2T2hzMYjEnab5RGJ gqD+zBtLPlQvS1Imdo/XE/lzd42IfuvEGZSmOPYja4voHkXZ2nPUXxvRbBXw8ve/6vou /izPEdv1cqhRFcYUHy1FfKtkGe5N4H80sl8WITnF+ItzzRcYUmrhGbj6MwDYdJTGcnZ3 gbt2UmIOIoiSJMC05+A4Isc8SRWPYjfAfARtQyzldmRKTpx4bC10uHlnqmjjXc18mecw ioPw== X-Forwarded-Encrypted: i=1; AJvYcCVL2xBiirBdS3j7nxfDhfSvz32o81fC68Asb2imqLq+s3oj5jLRoVIbgiAA2EaXdQqPEP2CMkB15HnZ3UA=@vger.kernel.org X-Gm-Message-State: AOJu0YzK55GEYgp4TdPMQ5m/SaV1xZwF1fKe7v5rjF6MzRD9SJeJPGHk ybgo17K+YyppHG+2X8Y18MixtiOQ2y2RVJEOajhgNcS8yTDzpg4Cx/mbLOVZt8XpR/Y= X-Gm-Gg: ASbGnctGEjPhQMHA6DRuCbaOJLYRTnk4hpzI4kBeaSY0+qFSg1+itfyNsPtrUJV4ijj 2w3V3bFOb+WloXHyNF7xKIBjkSUfsYgUxR93iyzSl4t6yHi3n5LQwHv2bu4NSChzgmC/UPbpIsu PeEVR0k7bIkexkhecnIHk0To/EteBnqr0CD9Qc5SOYWjQ7BNzinVv5DT4FVylcRtII//0/P4JqI FabAvCUjS7+y5T0i8b1bZ31hiAmDj9IiFbBSaMzuuyD9yRc1/4Vd/1pccnx7Za7KVsPGeUoAur1 3d4nceOi5m7swTMEk+iyz6v+BFyewQ3xMg7xZu4dW3Bt7eigWAMht/A= X-Google-Smtp-Source: AGHT+IFQs5Yfhw83+HikYGOQ48jqo93pTaMwpZUvn+UrY8WSWjGSBl22f3vTVXUW+HttqgtB0pFQ2A== X-Received: by 2002:a5d:5889:0:b0:3a4:ea9a:1656 with SMTP id ffacd0b85a97d-3a6d12bb683mr9713348f8f.10.1750669222866; Mon, 23 Jun 2025 02:00:22 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:5ce:238e:62a6:cbbc]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-453632312a3sm113401145e9.1.2025.06.23.02.00.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 02:00:22 -0700 (PDT) From: Bartosz Golaszewski Date: Mon, 23 Jun 2025 10:59:57 +0200 Subject: [PATCH v2 9/9] gpio: TODO: remove the task for the sysfs rework 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: <20250623-gpio-sysfs-chip-export-v2-9-d592793f8964@linaro.org> References: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> In-Reply-To: <20250623-gpio-sysfs-chip-export-v2-0-d592793f8964@linaro.org> To: Ahmad Fatoum , Kent Gibson , =?utf-8?q?Jan_L=C3=BCbbe?= , Marek Vasut , Geert Uytterhoeven , Linus Walleij , Bartosz Golaszewski Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1371; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=F4uLYTcDjYHCQKRyv318429+cTJ5TfubDfqP7y0o1W8=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBoWRebRY4drdXLUUaLUJNYoNFfebNHn7p87dJem 0w44f91D0GJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaFkXmwAKCRARpy6gFHHX cgxQD/9nqgrvD0r7rdK5BR9HWIVnYmIbGcJyK10Nd5pP9Xa+u4quKpeNsIIHQBAGB9odogjdT1N bMAmGIkxu211TVb/3AQHab7DIoWghICGLhWFDIBoNoTSSeo3es1iq3Ms3/LRDIg6OW8V6vcZw8J SIX7iu+t1oftJTLbfr9bU7I09Hil3tYODfeye9fhpYOm8nOlUb2FkTry7PwKbf6iOZDifB7HD+X YuovD0nNDfs6WSXxrmflUjobgmpc4d4sQNmvTsPOqz5C8onnmkwgsD4FG+745G01HEuZDSgjieZ 72sWcb0N7DvnjCTjHFcG7Y5ZWDclh9hV7c4B+3BTADyzL4jjTsSGcakVXf0Sjp1nVbXryTa7sW0 bZKoQi81Q2l2hAUXKbLvB4usQA1yLaSS4IXYGjCjdEKPLLvqtEOPyWxfvEtmq2uVpvBOhwfpnar yLcOEp3mZ+I4vkF1X7KtGRwAV4ClkRg/AeHJhU3hnCx+qGpo7l3yKWZvSJdhyIBLFyeOfITKm0+ pY7xjSFvRM1U5GXWJtu282Ozw8hnKJONPczECYU+vAaS7BJjkcIwKgyimwGowIeCyI5JcgjjPd5 zsTouzTDGgR6lpfUWWXpCTCq24GuOnAE0yqEvJ67c4yQ8fevu0uy4hGG1n6V8xQ4F8+ayt7ZnTa RZ8ODzGe4mTofqg== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski Remove the completed task tracking the rework of the sysfs interface. Signed-off-by: Bartosz Golaszewski --- drivers/gpio/TODO | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/drivers/gpio/TODO b/drivers/gpio/TODO index ef53892cb44d7c01d100f10f1b805c0aca561b46..a6380e51699cc5704aebefbda90= 6762fa60cfef3 100644 --- a/drivers/gpio/TODO +++ b/drivers/gpio/TODO @@ -188,19 +188,6 @@ remove the old ones and finally rename the new ones ba= ck to the old names. =20 --------------------------------------------------------------------------= ----- =20 -Extend the sysfs ABI to allow exporting lines by their HW offsets - -The need to support the sysfs GPIO class is one of the main obstacles to -removing the global GPIO numberspace from the kernel. In order to wean use= rs -off using global numbers from user-space, extend the existing interface wi= th -new per-gpiochip export/unexport attributes that allow to refer to GPIOs u= sing -their hardware offsets within the chip. - -Encourage users to switch to using them and eventually remove the existing -global export/unexport attribues. - ---------------------------------------------------------------------------= ----- - Remove GPIOD_FLAGS_BIT_NONEXCLUSIVE =20 GPIOs in the linux kernel are meant to be an exclusive resource. This means --=20 2.48.1