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