From: Harshit Shaw <shawharshit116@gmail.com>
To: andriy.shevchenko@intel.com
Cc: gregkh@linuxfoundation.org, error27@gmail.com, deller@gmx.de,
chintanlike@gmail.com, tzimmermann@suse.de,
linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org,
Harshit Shaw <shawharshit116@gmail.com>,
kernel test robot <lkp@intel.com>
Subject: [PATCH v4] staging: fbtft: convert sysfs attributes to use ATTRIBUTE_GROUPS
Date: Wed, 13 May 2026 06:42:57 +0000 [thread overview]
Message-ID: <20260513064257.1238-1-shawharshit116@gmail.com> (raw)
Replace direct device_create_file() calls with the correct
ATTRIBUTE_GROUPS() macro. Add fbtft_groups as dev_groups in the
driver structure so the driver core automatically adds and removes
the sysfs attributes when a device is bound or unbound.
Signed-off-by: Harshit Shaw <shawharshit116@gmail.com>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202605131232.m3YE1tEv-lkp@intel.com/
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
---
v4: Fix build error - add extern declaration of fbtft_groups in
fbtft.h so all drivers using FBTFT_REGISTER_DRIVER macro can
see the symbol
v3: Remove stray blank line in fbtft_attrs[] array
v2: - Use DEVICE_ATTR_RW() macro instead of DEVICE_ATTR()
- Move DEVICE_ATTR_RW() definitions closer to their callbacks
- Remove trailing comma after NULL in attribute array
- Use ATTRIBUTE_GROUPS() macro and add dev_groups to driver
structure as suggested by Greg KH and Andy Shevchenko
- Compile tested with: make M=drivers/staging/fbtft modules
drivers/staging/fbtft/fbtft-core.c | 3 --
drivers/staging/fbtft/fbtft-sysfs.c | 81 +++++++++++------------------
drivers/staging/fbtft/fbtft.h | 6 +++
drivers/staging/fbtft/internal.h | 2 -
4 files changed, 36 insertions(+), 56 deletions(-)
diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
index 3da42c8ca6e3..e6d33127cecc 100644
--- a/drivers/staging/fbtft/fbtft-core.c
+++ b/drivers/staging/fbtft/fbtft-core.c
@@ -782,8 +782,6 @@ int fbtft_register_framebuffer(struct fb_info *fb_info)
if (ret < 0)
goto reg_fail;
- fbtft_sysfs_init(par);
-
if (par->txbuf.buf && par->txbuf.len >= 1024)
sprintf(text1, ", %zu KiB buffer memory", par->txbuf.len >> 10);
if (spi)
@@ -826,7 +824,6 @@ int fbtft_unregister_framebuffer(struct fb_info *fb_info)
if (par->fbtftops.unregister_backlight)
par->fbtftops.unregister_backlight(par);
- fbtft_sysfs_exit(par);
unregister_framebuffer(fb_info);
return 0;
diff --git a/drivers/staging/fbtft/fbtft-sysfs.c b/drivers/staging/fbtft/fbtft-sysfs.c
index d05599d80011..579ac9dcdd9f 100644
--- a/drivers/staging/fbtft/fbtft-sysfs.c
+++ b/drivers/staging/fbtft/fbtft-sysfs.c
@@ -107,9 +107,18 @@ sprintf_gamma(struct fbtft_par *par, u32 *curves, char *buf)
return len;
}
-static ssize_t store_gamma_curve(struct device *device,
- struct device_attribute *attr,
- const char *buf, size_t count)
+static ssize_t gamma_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ struct fb_info *fb_info = dev_get_drvdata(device);
+ struct fbtft_par *par = fb_info->par;
+
+ return sprintf_gamma(par, par->gamma.curves, buf);
+}
+
+static ssize_t gamma_store(struct device *device,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
struct fbtft_par *par = fb_info->par;
@@ -133,18 +142,7 @@ static ssize_t store_gamma_curve(struct device *device,
return count;
}
-static ssize_t show_gamma_curve(struct device *device,
- struct device_attribute *attr, char *buf)
-{
- struct fb_info *fb_info = dev_get_drvdata(device);
- struct fbtft_par *par = fb_info->par;
-
- return sprintf_gamma(par, par->gamma.curves, buf);
-}
-
-static struct device_attribute gamma_device_attrs[] = {
- __ATTR(gamma, 0660, show_gamma_curve, store_gamma_curve),
-};
+static DEVICE_ATTR_RW(gamma);
void fbtft_expand_debug_value(unsigned long *debug)
{
@@ -173,7 +171,16 @@ void fbtft_expand_debug_value(unsigned long *debug)
}
}
-static ssize_t store_debug(struct device *device,
+static ssize_t debug_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ struct fb_info *fb_info = dev_get_drvdata(device);
+ struct fbtft_par *par = fb_info->par;
+
+ return sysfs_emit(buf, "%lu\n", par->debug);
+}
+
+static ssize_t debug_store(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
@@ -189,40 +196,12 @@ static ssize_t store_debug(struct device *device,
return count;
}
-static ssize_t show_debug(struct device *device,
- struct device_attribute *attr, char *buf)
-{
- struct fb_info *fb_info = dev_get_drvdata(device);
- struct fbtft_par *par = fb_info->par;
-
- return sysfs_emit(buf, "%lu\n", par->debug);
-}
+static DEVICE_ATTR_RW(debug);
-static struct device_attribute debug_device_attr =
- __ATTR(debug, 0660, show_debug, store_debug);
-
-void fbtft_sysfs_init(struct fbtft_par *par)
-{
- struct device *dev;
-
- dev = dev_of_fbinfo(par->info);
- if (!dev)
- return;
-
- device_create_file(dev, &debug_device_attr);
- if (par->gamma.curves && par->fbtftops.set_gamma)
- device_create_file(dev, &gamma_device_attrs[0]);
-}
-
-void fbtft_sysfs_exit(struct fbtft_par *par)
-{
- struct device *dev;
-
- dev = dev_of_fbinfo(par->info);
- if (!dev)
- return;
+static struct attribute *fbtft_attrs[] = {
+ &dev_attr_debug.attr,
+ &dev_attr_gamma.attr,
+ NULL
+};
- device_remove_file(dev, &debug_device_attr);
- if (par->gamma.curves && par->fbtftops.set_gamma)
- device_remove_file(dev, &gamma_device_attrs[0]);
-}
+ATTRIBUTE_GROUPS(fbtft);
diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h
index 317be17b95c1..1a3b9691f24a 100644
--- a/drivers/staging/fbtft/fbtft.h
+++ b/drivers/staging/fbtft/fbtft.h
@@ -8,6 +8,7 @@
#include <linux/spinlock.h>
#include <linux/spi/spi.h>
#include <linux/platform_device.h>
+#include <linux/sysfs.h>
#define FBTFT_ONBOARD_BACKLIGHT 2
@@ -274,6 +275,9 @@ void fbtft_write_reg8_bus9(struct fbtft_par *par, int len, ...);
void fbtft_write_reg16_bus8(struct fbtft_par *par, int len, ...);
void fbtft_write_reg16_bus16(struct fbtft_par *par, int len, ...);
+/* fbtft-sysfs.c */
+extern const struct attribute_group *fbtft_groups[];
+
#define FBTFT_DT_TABLE(_compatible) \
static const struct of_device_id dt_ids[] = { \
{ .compatible = _compatible }, \
@@ -299,6 +303,7 @@ static struct spi_driver fbtft_driver_spi_driver = { \
.driver = { \
.name = _name, \
.of_match_table = dt_ids, \
+ .dev_groups = fbtft_groups, \
}, \
.id_table = _spi_ids, \
.probe = fbtft_driver_probe_spi, \
@@ -328,6 +333,7 @@ static struct platform_driver fbtft_driver_platform_driver = { \
.name = _name, \
.owner = THIS_MODULE, \
.of_match_table = dt_ids, \
+ .dev_groups = fbtft_groups, \
}, \
.probe = fbtft_driver_probe_pdev, \
.remove = fbtft_driver_remove_pdev, \
diff --git a/drivers/staging/fbtft/internal.h b/drivers/staging/fbtft/internal.h
index ae2ff4a4a472..7869cf8dbf2a 100644
--- a/drivers/staging/fbtft/internal.h
+++ b/drivers/staging/fbtft/internal.h
@@ -4,8 +4,6 @@
#ifndef __LINUX_FBTFT_INTERNAL_H
#define __LINUX_FBTFT_INTERNAL_H
-void fbtft_sysfs_init(struct fbtft_par *par);
-void fbtft_sysfs_exit(struct fbtft_par *par);
void fbtft_expand_debug_value(unsigned long *debug);
int fbtft_gamma_parse_str(struct fbtft_par *par, u32 *curves,
const char *str, int size);
--
2.53.0
next reply other threads:[~2026-05-13 6:43 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 6:42 Harshit Shaw [this message]
2026-05-13 7:12 ` [PATCH v4] staging: fbtft: convert sysfs attributes to use ATTRIBUTE_GROUPS Greg KH
2026-05-13 11:20 ` Andy Shevchenko
-- strict thread matches above, loose matches on Subject: below --
2026-05-13 8:59 Harshit Shaw
2026-05-13 10:37 ` Greg KH
2026-05-13 10:53 ` M.samet Duman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260513064257.1238-1-shawharshit116@gmail.com \
--to=shawharshit116@gmail.com \
--cc=andriy.shevchenko@intel.com \
--cc=chintanlike@gmail.com \
--cc=deller@gmx.de \
--cc=error27@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-staging@lists.linux.dev \
--cc=lkp@intel.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.