Commit c4804670 authored by M Chetan Kumar's avatar M Chetan Kumar Committed by David S. Miller
Browse files

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: default avatarM Chetan Kumar <m.chetan.kumar@linux.intel.com>
Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a9c2cf9e
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@

#include <linux/err.h>
#include <linux/errno.h>
#include <linux/debugfs.h>
#include <linux/fs.h>
#include <linux/init.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 struct class *wwan_class;
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_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.
 * @ops: wwan device ops
 * @ops_ctxt: context to pass to ops
 * @debugfs_dir:  WWAN device debugfs dir
 */
struct wwan_device {
	unsigned int id;
@@ -47,6 +50,7 @@ struct wwan_device {
	atomic_t port_id;
	const struct wwan_ops *ops;
	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);
}

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
 * 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
@@ -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)
{
	struct wwan_device *wwandev;
	const char *wwandev_name;
	int err, id;

	/* 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;
	}

	wwandev_name = kobject_name(&wwandev->dev.kobj);
	wwandev->debugfs_dir = debugfs_create_dir(wwandev_name,
						  wwan_debugfs_dir);

done_unlock:
	mutex_unlock(&wwan_register_lock);

@@ -218,10 +239,12 @@ static void wwan_remove_dev(struct wwan_device *wwandev)
	else
		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);
	else
	} else {
		put_device(&wwandev->dev);
	}

	mutex_unlock(&wwan_register_lock);
}
@@ -1117,6 +1140,8 @@ static int __init wwan_init(void)
		goto destroy;
	}

	wwan_debugfs_dir = debugfs_create_dir("wwan", NULL);

	return 0;

destroy:
@@ -1128,6 +1153,7 @@ static int __init wwan_init(void)

static void __exit wwan_exit(void)
{
	debugfs_remove_recursive(wwan_debugfs_dir);
	__unregister_chrdev(wwan_major, 0, WWAN_MAX_MINORS, "wwan_port");
	rtnl_link_unregister(&wwan_rtnl_link_ops);
	class_destroy(wwan_class);
+2 −0
Original line number Diff line number Diff line
@@ -171,4 +171,6 @@ int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,

void wwan_unregister_ops(struct device *parent);

struct dentry *wwan_get_debugfs_dir(struct device *parent);

#endif /* __WWAN_H */