forked from Minki/linux
net: wwan: common debugfs base dir for wwan device
This patch set brings in a common debugfs base directory i.e. /sys/kernel/debugfs/wwan/ in WWAN Subsystem for a WWAN device instance. So that it avoids driver polluting debugfs root with unrelated directories & possible name collusion. Having a common debugfs base directory for WWAN drivers eases user to match control devices with debugfs entries. WWAN Subsystem creates dentry (/sys/kernel/debugfs/wwan) on module load & removes dentry on module unload. When driver registers a new wwan device, dentry (wwanX) is created for WWAN device instance & on driver unregister dentry is removed. New API is introduced to return the wwan device instance dentry so that driver can create debugfs entries under it. Signed-off-by: M Chetan Kumar <m.chetan.kumar@linux.intel.com> Reviewed-by: Loic Poulain <loic.poulain@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a9c2cf9e93
commit
c480467002
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
#include <linux/debugfs.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
@ -25,6 +26,7 @@ static DEFINE_IDA(minors); /* minors for WWAN port chardevs */
|
|||||||
static DEFINE_IDA(wwan_dev_ids); /* for unique WWAN device IDs */
|
static DEFINE_IDA(wwan_dev_ids); /* for unique WWAN device IDs */
|
||||||
static struct class *wwan_class;
|
static struct class *wwan_class;
|
||||||
static int wwan_major;
|
static int wwan_major;
|
||||||
|
static struct dentry *wwan_debugfs_dir;
|
||||||
|
|
||||||
#define to_wwan_dev(d) container_of(d, struct wwan_device, dev)
|
#define to_wwan_dev(d) container_of(d, struct wwan_device, dev)
|
||||||
#define to_wwan_port(d) container_of(d, struct wwan_port, dev)
|
#define to_wwan_port(d) container_of(d, struct wwan_port, dev)
|
||||||
@ -40,6 +42,7 @@ static int wwan_major;
|
|||||||
* @port_id: Current available port ID to pick.
|
* @port_id: Current available port ID to pick.
|
||||||
* @ops: wwan device ops
|
* @ops: wwan device ops
|
||||||
* @ops_ctxt: context to pass to ops
|
* @ops_ctxt: context to pass to ops
|
||||||
|
* @debugfs_dir: WWAN device debugfs dir
|
||||||
*/
|
*/
|
||||||
struct wwan_device {
|
struct wwan_device {
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
@ -47,6 +50,7 @@ struct wwan_device {
|
|||||||
atomic_t port_id;
|
atomic_t port_id;
|
||||||
const struct wwan_ops *ops;
|
const struct wwan_ops *ops;
|
||||||
void *ops_ctxt;
|
void *ops_ctxt;
|
||||||
|
struct dentry *debugfs_dir;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -142,6 +146,18 @@ static struct wwan_device *wwan_dev_get_by_name(const char *name)
|
|||||||
return to_wwan_dev(dev);
|
return to_wwan_dev(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct dentry *wwan_get_debugfs_dir(struct device *parent)
|
||||||
|
{
|
||||||
|
struct wwan_device *wwandev;
|
||||||
|
|
||||||
|
wwandev = wwan_dev_get_by_parent(parent);
|
||||||
|
if (IS_ERR(wwandev))
|
||||||
|
return ERR_CAST(wwandev);
|
||||||
|
|
||||||
|
return wwandev->debugfs_dir;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir);
|
||||||
|
|
||||||
/* This function allocates and registers a new WWAN device OR if a WWAN device
|
/* This function allocates and registers a new WWAN device OR if a WWAN device
|
||||||
* already exist for the given parent, it gets a reference and return it.
|
* already exist for the given parent, it gets a reference and return it.
|
||||||
* This function is not exported (for now), it is called indirectly via
|
* This function is not exported (for now), it is called indirectly via
|
||||||
@ -150,6 +166,7 @@ static struct wwan_device *wwan_dev_get_by_name(const char *name)
|
|||||||
static struct wwan_device *wwan_create_dev(struct device *parent)
|
static struct wwan_device *wwan_create_dev(struct device *parent)
|
||||||
{
|
{
|
||||||
struct wwan_device *wwandev;
|
struct wwan_device *wwandev;
|
||||||
|
const char *wwandev_name;
|
||||||
int err, id;
|
int err, id;
|
||||||
|
|
||||||
/* The 'find-alloc-register' operation must be protected against
|
/* The 'find-alloc-register' operation must be protected against
|
||||||
@ -189,6 +206,10 @@ static struct wwan_device *wwan_create_dev(struct device *parent)
|
|||||||
goto done_unlock;
|
goto done_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wwandev_name = kobject_name(&wwandev->dev.kobj);
|
||||||
|
wwandev->debugfs_dir = debugfs_create_dir(wwandev_name,
|
||||||
|
wwan_debugfs_dir);
|
||||||
|
|
||||||
done_unlock:
|
done_unlock:
|
||||||
mutex_unlock(&wwan_register_lock);
|
mutex_unlock(&wwan_register_lock);
|
||||||
|
|
||||||
@ -218,10 +239,12 @@ static void wwan_remove_dev(struct wwan_device *wwandev)
|
|||||||
else
|
else
|
||||||
ret = device_for_each_child(&wwandev->dev, NULL, is_wwan_child);
|
ret = device_for_each_child(&wwandev->dev, NULL, is_wwan_child);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
|
debugfs_remove_recursive(wwandev->debugfs_dir);
|
||||||
device_unregister(&wwandev->dev);
|
device_unregister(&wwandev->dev);
|
||||||
else
|
} else {
|
||||||
put_device(&wwandev->dev);
|
put_device(&wwandev->dev);
|
||||||
|
}
|
||||||
|
|
||||||
mutex_unlock(&wwan_register_lock);
|
mutex_unlock(&wwan_register_lock);
|
||||||
}
|
}
|
||||||
@ -1117,6 +1140,8 @@ static int __init wwan_init(void)
|
|||||||
goto destroy;
|
goto destroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wwan_debugfs_dir = debugfs_create_dir("wwan", NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
destroy:
|
destroy:
|
||||||
@ -1128,6 +1153,7 @@ unregister:
|
|||||||
|
|
||||||
static void __exit wwan_exit(void)
|
static void __exit wwan_exit(void)
|
||||||
{
|
{
|
||||||
|
debugfs_remove_recursive(wwan_debugfs_dir);
|
||||||
__unregister_chrdev(wwan_major, 0, WWAN_MAX_MINORS, "wwan_port");
|
__unregister_chrdev(wwan_major, 0, WWAN_MAX_MINORS, "wwan_port");
|
||||||
rtnl_link_unregister(&wwan_rtnl_link_ops);
|
rtnl_link_unregister(&wwan_rtnl_link_ops);
|
||||||
class_destroy(wwan_class);
|
class_destroy(wwan_class);
|
||||||
|
@ -171,4 +171,6 @@ int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,
|
|||||||
|
|
||||||
void wwan_unregister_ops(struct device *parent);
|
void wwan_unregister_ops(struct device *parent);
|
||||||
|
|
||||||
|
struct dentry *wwan_get_debugfs_dir(struct device *parent);
|
||||||
|
|
||||||
#endif /* __WWAN_H */
|
#endif /* __WWAN_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user