Commit 04edfa7f authored by Dan Williams's avatar Dan Williams Committed by Greg Kroah-Hartman

sysfs: Introduce DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE()

One of the first users of DEFINE_SYSFS_GROUP_VISIBLE() did this:

	static umode_t dp0_attr_visible(struct kobject *kobj,
					struct attribute *attr,
					int n)
	{
		struct sdw_slave *slave = dev_to_sdw_dev(kobj_to_dev(kobj));

		if (slave->prop.dp0_prop)
			return attr->mode;
		return 0;
	}

	static bool dp0_group_visible(struct kobject *kobj)
	{
		struct sdw_slave *slave = dev_to_sdw_dev(kobj_to_dev(kobj));

		if (slave->prop.dp0_prop)
			return true;
		return false;
	}
	DEFINE_SYSFS_GROUP_VISIBLE(dp0);

...i.e. the _group_visible() helper is identical to the _attr_visible()
helper. Use the "simple" helper to reduce that to:

	static bool dp0_group_visible(struct kobject *kobj)
	{
		struct sdw_slave *slave = dev_to_sdw_dev(kobj_to_dev(kobj));

		if (slave->prop.dp0_prop)
			return true;
		return false;
	}
	DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(dp0);

Remove the need to specify per attribute visibility if the goal is to
hide the entire group.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/r/170863446625.1479840.10593839479268727913.stgit@dwillia2-xfh.jf.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent aa3c8899
......@@ -140,7 +140,9 @@ struct attribute_group {
* };
*
* Note that it expects <name>_attr_visible and <name>_group_visible to
* be defined.
* be defined. For cases where individual attributes do not need
* separate visibility consideration, only entire group visibility at
* once, see DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE().
*/
#define DEFINE_SYSFS_GROUP_VISIBLE(name) \
static inline umode_t sysfs_group_visible_##name( \
......@@ -151,6 +153,38 @@ struct attribute_group {
return name##_attr_visible(kobj, attr, n); \
}
/*
* DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(name):
* A helper macro to pair with SYSFS_GROUP_VISIBLE() that like
* DEFINE_SYSFS_GROUP_VISIBLE() controls group visibility, but does
* not require the implementation of a per-attribute visibility
* callback.
* Ex.
*
* static bool example_group_visible(struct kobject *kobj)
* {
* if (example_group_condition)
* return false;
* return true;
* }
*
* DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(example);
*
* static struct attribute_group example_group = {
* .name = "example",
* .is_visible = SYSFS_GROUP_VISIBLE(example),
* .attrs = &example_attrs,
* };
*/
#define DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(name) \
static inline umode_t sysfs_group_visible_##name( \
struct kobject *kobj, struct attribute *a, int n) \
{ \
if (n == 0 && !name##_group_visible(kobj)) \
return SYSFS_GROUP_INVISIBLE; \
return a->mode; \
}
/*
* Same as DEFINE_SYSFS_GROUP_VISIBLE, but for groups with only binary
* attributes. If an attribute_group defines both text and binary
......@@ -166,6 +200,15 @@ struct attribute_group {
return name##_attr_visible(kobj, attr, n); \
}
#define DEFINE_SIMPLE_SYSFS_BIN_GROUP_VISIBLE(name) \
static inline umode_t sysfs_group_visible_##name( \
struct kobject *kobj, struct bin_attribute *a, int n) \
{ \
if (n == 0 && !name##_group_visible(kobj)) \
return SYSFS_GROUP_INVISIBLE; \
return a->mode; \
}
#define SYSFS_GROUP_VISIBLE(fn) sysfs_group_visible_##fn
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment