0x1af4
  V   ˆX‰¤~VÅ�Ñ d–Ü4ý(&”ÔD¨ 	ÅÍÆÁp©‹Fÿ{‹„„-i[D<†ªoZƒ›Ù«483Ãa–Ü4ý(&”ÔD¨ 	Å�‚àS�ÿÅ ã    ‹      Í•Qo›0Çßû)<?ì�	íZÇÓ"­SšFkªi�6`	°e.eí§¯	hIµ ­R7Åpºû‹ûýt°ñÝlýs5'_×·²z¸^ÜÌ ~D3€xw…óQ8˜/)¡9¢½hšfÔD#ã2X‡Ëâjt:Á‘DIùksüŒ°\	éï„¡ÆBñ›Jª_Ä¤S¥:»^ÎáÛ¶´ÏÛ45…BÔÐØÀ—QU¶Øfºª}*5®¬ƒB£T¥-ª´WeN 6UÍ ëá»Bß–mŒ|jiÆÿ¸³o°3)6;€6tœaNE¡³jJÑXÊ?V›Ú^yÎ¼­q&HîT:¥ŸgÓåÕÝ4¦|)JÅ@ð£š[¯ùBùBÔHJ#uª•ßwâ{ý<üÀ¸ÓÄªNœ¶­•½¼�C#‰)j+¼“ÊYîU�Dx•mmßö�ÆOùJ8¯#±v*AãžZtÒ�ß]_C�žÏé,GêÅÁqåÛM	í�üå€áÕ ˜„“OÁ8&	£ËÉÅ ðQý|kî-#Ï~,Û›9!vU¨Ò¿sã<ñ>þcè'DÜ.E«<nû@N·±‰‘-nüÜ¿Ü8ÐoZ»Ï ûß¼ 
ø…ÖÒ    #   	ˆl–äY>”TÔD¨ 	Å�rã`S�ÿÉƒyç[È¿Æ "«    	/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * configfs.h - definitions for the device driver filesystem
 *
 * Based on sysfs:
 * 	sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
 *
 * Based on kobject.h:
 *      Copyright (c) 2002-2003	Patrick Mochel
 *      Copyright (c) 2002-2003	Open Source Development Labs
 *
 * configfs Copyright (C) 2005 Oracle.  All rights reserved.
 *
 * Please read Documentation/filesystems/configfs.rst before using
 * the configfs interface, ESPECIALLY the parts about reference counts and
 * item destructors.
 */

#ifndef _CONFIGFS_H_
#define _CONFIGFS_H_

#include <linux/stat.h>   /* S_IRUGO */
#include <linux/types.h>  /* ssize_t */
#include <linux/list.h>   /* struct list_head */
#include <linux/kref.h>   /* struct kref */
#include <linux/mutex.h>  /* struct mutex */

#define CONFIGFS_ITEM_NAME_LEN	20

struct module;

struct configfs_item_operations;
struct configfs_group_operations;
struct configfs_attribute;
struct configfs_bin_attribute;
struct configfs_subsystem;

struct config_item {
	char			*ci_name;
	char			ci_namebuf[CONFIGFS_ITEM_NAME_LEN];
	struct kref		ci_kref;
	struct list_head	ci_entry;
	struct config_item	*ci_parent;
	struct config_group	*ci_group;
	const struct config_item_type	*ci_type;
	struct dentry		*ci_dentry;
};

extern __printf(2, 3)
int config_item_set_name(struct config_item *, const char *, ...);

static inline char *config_item_name(struct config_item * item)
{
	return item->ci_name;
}

extern void config_item_init_type_name(struct config_item *item,
				       const char *name,
				       const struct config_item_type *type);

extern struct config_item *config_item_get(struct config_item *);
extern struct config_item *config_item_get_unless_zero(struct config_item *);
extern void config_item_put(struct config_item *);

struct config_item_type {
	struct module				*ct_owner;
	struct configfs_item_operations		*ct_item_ops;
	struct configfs_group_operations	*ct_group_ops;
	struct configfs_attribute		**ct_attrs;
	struct configfs_bin_attribute		**ct_bin_attrs;
};

/**
 *	group - a group of config_items of a specific type, belonging
 *	to a specific subsystem.
 */
struct config_group {
	struct config_item		cg_item;
	struct list_head		cg_children;
	struct configfs_subsystem 	*cg_subsys;
	struct list_head		default_groups;
	struct list_head		group_entry;
};

extern void config_group_init(struct config_group *group);
extern void config_group_init_type_name(struct config_group *group,
					const char *name,
					const struct config_item_type *type);

static inline struct config_group *to_config_group(struct config_item *item)
{
	return item ? container_of(item,struct config_group,cg_item) : NULL;
}

static inline struct config_group *config_group_get(struct config_group *group)
{
	return group ? to_config_group(config_item_get(&group->cg_item)) : NULL;
}

static inline void config_group_put(struct config_group *group)
{
	config_item_put(&group->cg_item);
}

extern struct config_item *config_group_find_item(struct config_group *,
						  const char *);


static inline void configfs_add_default_group(struct config_group *new_group,
		struct config_group *group)
{
	list_add_tail(&new_group->group_entry, &group->default_groups);
}

struct configfs_attribute {
	const char		*ca_name;
	struct module 		*ca_owner;
	umode_t			ca_mode;
	ssize_t (*show)(struct config_item *, char *);
	ssize_t (*store)(struct config_item *, const char *, si