From 72161038f2a84ddcec4c66c42a7a2e9f3d0af4dd Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Tue, 9 Jun 2020 17:39:37 -0700 Subject: [PATCH] cnss2: Add support to create device sysfs group Currently CNSS driver creates sysfs nodes from different paths. Add support to create device sysfs group to consolidate the paths so that it will be easy to extend in the future. Change-Id: I9e923288018cad558d3cd591f08f73dcf9c60219 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/main.c | 72 ++++++++++++++++++------------- drivers/net/wireless/cnss2/main.h | 1 - 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index eef8058e4638..f528e73b6538 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -1985,11 +1985,11 @@ static void cnss_unregister_bus_scale(struct cnss_plat_data *plat_priv) icc_put(bus_bw_info->cnss_path); } -static ssize_t shutdown_store(struct kobject *kobj, - struct kobj_attribute *attr, +static ssize_t shutdown_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { - struct cnss_plat_data *plat_priv = cnss_get_plat_priv(NULL); + struct cnss_plat_data *plat_priv = dev_get_drvdata(dev); if (plat_priv) { set_bit(CNSS_IN_REBOOT, &plat_priv->driver_state); @@ -2046,54 +2046,66 @@ static ssize_t fs_ready_store(struct device *dev, return count; } -static struct kobj_attribute shutdown_attribute = __ATTR_WO(shutdown); static DEVICE_ATTR_WO(fs_ready); +static DEVICE_ATTR_WO(shutdown); -static int cnss_create_shutdown_sysfs(struct cnss_plat_data *plat_priv) +static struct attribute *cnss_attrs[] = { + &dev_attr_fs_ready.attr, + &dev_attr_shutdown.attr, + NULL, +}; + +static struct attribute_group cnss_attr_group = { + .attrs = cnss_attrs, +}; + +static int cnss_create_sysfs_link(struct cnss_plat_data *plat_priv) { - int ret = 0; + struct device *dev = &plat_priv->plat_dev->dev; + int ret; - plat_priv->shutdown_kobj = kobject_create_and_add("shutdown_wlan", - kernel_kobj); - if (!plat_priv->shutdown_kobj) { - cnss_pr_err("Failed to create shutdown_wlan kernel object\n"); - return -ENOMEM; - } - - ret = sysfs_create_file(plat_priv->shutdown_kobj, - &shutdown_attribute.attr); + ret = sysfs_create_link(kernel_kobj, &dev->kobj, "cnss"); if (ret) { - cnss_pr_err("Failed to create sysfs shutdown file, err = %d\n", + cnss_pr_err("Failed to create cnss link, err = %d\n", ret); - kobject_put(plat_priv->shutdown_kobj); - plat_priv->shutdown_kobj = NULL; + goto out; } + /* This is only for backward compatibility. */ + ret = sysfs_create_link(kernel_kobj, &dev->kobj, "shutdown_wlan"); + if (ret) { + cnss_pr_err("Failed to create shutdown_wlan link, err = %d\n", + ret); + goto rm_cnss_link; + } + + return 0; + +rm_cnss_link: + sysfs_remove_link(kernel_kobj, "cnss"); +out: return ret; } -static void cnss_remove_shutdown_sysfs(struct cnss_plat_data *plat_priv) +static void cnss_remove_sysfs_link(struct cnss_plat_data *plat_priv) { - if (plat_priv->shutdown_kobj) { - sysfs_remove_file(plat_priv->shutdown_kobj, - &shutdown_attribute.attr); - kobject_put(plat_priv->shutdown_kobj); - plat_priv->shutdown_kobj = NULL; - } + sysfs_remove_link(kernel_kobj, "shutdown_wlan"); + sysfs_remove_link(kernel_kobj, "cnss"); } static int cnss_create_sysfs(struct cnss_plat_data *plat_priv) { int ret = 0; - ret = device_create_file(&plat_priv->plat_dev->dev, &dev_attr_fs_ready); + ret = devm_device_add_group(&plat_priv->plat_dev->dev, + &cnss_attr_group); if (ret) { - cnss_pr_err("Failed to create device fs_ready file, err = %d\n", + cnss_pr_err("Failed to create cnss device group, err = %d\n", ret); goto out; } - cnss_create_shutdown_sysfs(plat_priv); + cnss_create_sysfs_link(plat_priv); return 0; out: @@ -2102,8 +2114,8 @@ out: static void cnss_remove_sysfs(struct cnss_plat_data *plat_priv) { - cnss_remove_shutdown_sysfs(plat_priv); - device_remove_file(&plat_priv->plat_dev->dev, &dev_attr_fs_ready); + cnss_remove_sysfs_link(plat_priv); + devm_device_remove_group(&plat_priv->plat_dev->dev, &cnss_attr_group); } static int cnss_event_work_init(struct cnss_plat_data *plat_priv) diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index 8d0a94092b19..2a352b61e65b 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -400,7 +400,6 @@ struct cnss_plat_data { bool cbc_enabled; u8 use_nv_mac; u8 set_wlaon_pwr_ctrl; - struct kobject *shutdown_kobj; }; #ifdef CONFIG_ARCH_QCOM