[PATCH] drm/arm/komeda: Register sysfs groups through driver core
oushixiong1025 at 163.com
oushixiong1025 at 163.com
Tue May 20 07:00:46 UTC 2025
From: Shixiong Ou <oushixiong at kylinos.cn>
[WHY] If the call to sysfs_create_group() fails, there is no need to
call function sysfs_remove_group().
But if calling sysfs_create_group() fails, it will go to label
'err_cleanup:' in komeda_dev_create(), and it will call
komeda_dev_destroy() laterly.
[HOW] Register sysfs groups through driver core.
Signed-off-by: Shixiong Ou <oushixiong at kylinos.cn>
---
.../gpu/drm/arm/display/komeda/komeda_dev.c | 60 -------------------
.../gpu/drm/arm/display/komeda/komeda_drv.c | 51 ++++++++++++++++
2 files changed, 51 insertions(+), 60 deletions(-)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
index 5ba62e637a61..a285fec3be23 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
@@ -53,58 +53,6 @@ static void komeda_debugfs_init(struct komeda_dev *mdev)
&mdev->err_verbosity);
}
-static ssize_t
-core_id_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct komeda_dev *mdev = dev_to_mdev(dev);
-
- return sysfs_emit(buf, "0x%08x\n", mdev->chip.core_id);
-}
-static DEVICE_ATTR_RO(core_id);
-
-static ssize_t
-config_id_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct komeda_dev *mdev = dev_to_mdev(dev);
- struct komeda_pipeline *pipe = mdev->pipelines[0];
- union komeda_config_id config_id;
- int i;
-
- memset(&config_id, 0, sizeof(config_id));
-
- config_id.max_line_sz = pipe->layers[0]->hsize_in.end;
- config_id.n_pipelines = mdev->n_pipelines;
- config_id.n_scalers = pipe->n_scalers;
- config_id.n_layers = pipe->n_layers;
- config_id.n_richs = 0;
- for (i = 0; i < pipe->n_layers; i++) {
- if (pipe->layers[i]->layer_type == KOMEDA_FMT_RICH_LAYER)
- config_id.n_richs++;
- }
- return sysfs_emit(buf, "0x%08x\n", config_id.value);
-}
-static DEVICE_ATTR_RO(config_id);
-
-static ssize_t
-aclk_hz_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct komeda_dev *mdev = dev_to_mdev(dev);
-
- return sysfs_emit(buf, "%lu\n", clk_get_rate(mdev->aclk));
-}
-static DEVICE_ATTR_RO(aclk_hz);
-
-static struct attribute *komeda_sysfs_entries[] = {
- &dev_attr_core_id.attr,
- &dev_attr_config_id.attr,
- &dev_attr_aclk_hz.attr,
- NULL,
-};
-
-static struct attribute_group komeda_sysfs_attr_group = {
- .attrs = komeda_sysfs_entries,
-};
-
static int komeda_parse_pipe_dt(struct komeda_pipeline *pipe)
{
struct device_node *np = pipe->of_node;
@@ -253,12 +201,6 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
clk_disable_unprepare(mdev->aclk);
- err = sysfs_create_group(&dev->kobj, &komeda_sysfs_attr_group);
- if (err) {
- DRM_ERROR("create sysfs group failed.\n");
- goto err_cleanup;
- }
-
mdev->err_verbosity = KOMEDA_DEV_PRINT_ERR_EVENTS;
komeda_debugfs_init(mdev);
@@ -278,8 +220,6 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
const struct komeda_dev_funcs *funcs = mdev->funcs;
int i;
- sysfs_remove_group(&dev->kobj, &komeda_sysfs_attr_group);
-
debugfs_remove_recursive(mdev->debugfs_root);
if (mdev->aclk)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index 358c1512b087..598d2f985dad 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -4,6 +4,7 @@
* Author: James.Qian.Wang <james.qian.wang at arm.com>
*
*/
+#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/of.h>
@@ -20,6 +21,55 @@ struct komeda_drv {
struct komeda_kms_dev *kms;
};
+static ssize_t
+aclk_hz_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct komeda_dev *mdev = dev_to_mdev(dev);
+
+ return sysfs_emit(buf, "%lu\n", clk_get_rate(mdev->aclk));
+}
+static DEVICE_ATTR_RO(aclk_hz);
+
+static ssize_t
+config_id_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct komeda_dev *mdev = dev_to_mdev(dev);
+ struct komeda_pipeline *pipe = mdev->pipelines[0];
+ union komeda_config_id config_id;
+ int i;
+
+ memset(&config_id, 0, sizeof(config_id));
+
+ config_id.max_line_sz = pipe->layers[0]->hsize_in.end;
+ config_id.n_pipelines = mdev->n_pipelines;
+ config_id.n_scalers = pipe->n_scalers;
+ config_id.n_layers = pipe->n_layers;
+ config_id.n_richs = 0;
+ for (i = 0; i < pipe->n_layers; i++) {
+ if (pipe->layers[i]->layer_type == KOMEDA_FMT_RICH_LAYER)
+ config_id.n_richs++;
+ }
+ return sysfs_emit(buf, "0x%08x\n", config_id.value);
+}
+static DEVICE_ATTR_RO(config_id);
+
+static ssize_t
+core_id_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct komeda_dev *mdev = dev_to_mdev(dev);
+
+ return sysfs_emit(buf, "0x%08x\n", mdev->chip.core_id);
+}
+static DEVICE_ATTR_RO(core_id);
+
+static struct attribute *komeda_sysfs_attrs[] = {
+ &dev_attr_aclk_hz.attr,
+ &dev_attr_config_id.attr,
+ &dev_attr_core_id.attr,
+ NULL,
+};
+ATTRIBUTE_GROUPS(komeda_sysfs);
+
struct komeda_dev *dev_to_mdev(struct device *dev)
{
struct komeda_drv *mdrv = dev_get_drvdata(dev);
@@ -158,6 +208,7 @@ static struct platform_driver komeda_platform_driver = {
.driver = {
.name = "komeda",
.of_match_table = komeda_of_match,
+ .dev_groups = komeda_sysfs_groups,
.pm = &komeda_pm_ops,
},
};
--
2.17.1
More information about the dri-devel
mailing list