From: Shixiong Ou <oushixi...@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 <oushixi...@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.w...@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

Reply via email to