Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db3e50f3 authored by Sakari Ailus's avatar Sakari Ailus Committed by Rafael J. Wysocki
Browse files

device property: Get rid of struct fwnode_handle type field



Instead of relying on the struct fwnode_handle type field, define
fwnode_operations structs for all separate types of fwnodes. To find out
the type, compare to the ops field to relevant ops structs.

This change has two benefits:

1. it avoids adding the type field to each and every instance of struct
fwnode_handle, thus saving memory and

2. makes the ops field the single factor that defines both the types of
the fwnode as well as defines the implementation of its operations,
decreasing the possibility of bugs when developing code dealing with
fwnode internals.

Suggested-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b81b7291
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -56,8 +56,7 @@ static bool acpi_nondev_subnode_extract(const union acpi_object *desc,
		return false;

	dn->name = link->package.elements[0].string.pointer;
	dn->fwnode.type = FWNODE_ACPI_DATA;
	dn->fwnode.ops = &acpi_fwnode_ops;
	dn->fwnode.ops = &acpi_data_fwnode_ops;
	dn->parent = parent;
	INIT_LIST_HEAD(&dn->data.subnodes);

@@ -469,10 +468,10 @@ EXPORT_SYMBOL_GPL(acpi_dev_get_property);

static struct acpi_device_data *acpi_device_data_of_node(struct fwnode_handle *fwnode)
{
	if (fwnode->type == FWNODE_ACPI) {
	if (is_acpi_device_node(fwnode)) {
		struct acpi_device *adev = to_acpi_device_node(fwnode);
		return &adev->data;
	} else if (fwnode->type == FWNODE_ACPI_DATA) {
	} else if (is_acpi_data_node(fwnode)) {
		struct acpi_data_node *dn = to_acpi_data_node(fwnode);
		return &dn->data;
	}
@@ -903,7 +902,7 @@ struct fwnode_handle *acpi_get_next_subnode(struct fwnode_handle *fwnode,
	struct acpi_device *adev = to_acpi_device_node(fwnode);
	struct list_head *head, *next;

	if (!child || child->type == FWNODE_ACPI) {
	if (!child || is_acpi_device_node(child)) {
		if (adev)
			head = &adev->children;
		else
@@ -927,7 +926,7 @@ struct fwnode_handle *acpi_get_next_subnode(struct fwnode_handle *fwnode,
	}

 nondev:
	if (!child || child->type == FWNODE_ACPI_DATA) {
	if (!child || is_acpi_data_node(child)) {
		struct acpi_data_node *data = to_acpi_data_node(fwnode);
		struct acpi_data_node *dn;

@@ -1223,16 +1222,26 @@ static int acpi_fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
	return 0;
}

const struct fwnode_operations acpi_fwnode_ops = {
	.device_is_available = acpi_fwnode_device_is_available,
	.property_present = acpi_fwnode_property_present,
	.property_read_int_array = acpi_fwnode_property_read_int_array,
	.property_read_string_array = acpi_fwnode_property_read_string_array,
	.get_parent = acpi_node_get_parent,
	.get_next_child_node = acpi_get_next_subnode,
	.get_named_child_node = acpi_fwnode_get_named_child_node,
	.graph_get_next_endpoint = acpi_fwnode_graph_get_next_endpoint,
	.graph_get_remote_endpoint = acpi_fwnode_graph_get_remote_endpoint,
	.graph_get_port_parent = acpi_node_get_parent,
	.graph_parse_endpoint = acpi_fwnode_graph_parse_endpoint,
};
#define DECLARE_ACPI_FWNODE_OPS(ops) \
	const struct fwnode_operations ops = {				\
		.device_is_available = acpi_fwnode_device_is_available, \
		.property_present = acpi_fwnode_property_present,	\
		.property_read_int_array =				\
			acpi_fwnode_property_read_int_array,		\
		.property_read_string_array =				\
			acpi_fwnode_property_read_string_array,		\
		.get_parent = acpi_node_get_parent,			\
		.get_next_child_node = acpi_get_next_subnode,		\
		.get_named_child_node = acpi_fwnode_get_named_child_node, \
		.graph_get_next_endpoint =				\
			acpi_fwnode_graph_get_next_endpoint,		\
		.graph_get_remote_endpoint =				\
			acpi_fwnode_graph_get_remote_endpoint,		\
		.graph_get_port_parent = acpi_node_get_parent,		\
		.graph_parse_endpoint = acpi_fwnode_graph_parse_endpoint, \
	};								\
	EXPORT_SYMBOL_GPL(ops)

DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops);
DECLARE_ACPI_FWNODE_OPS(acpi_data_fwnode_ops);
const struct fwnode_operations acpi_static_fwnode_ops;
+1 −2
Original line number Diff line number Diff line
@@ -1467,8 +1467,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
	device->device_type = type;
	device->handle = handle;
	device->parent = acpi_bus_get_parent(handle);
	device->fwnode.type = FWNODE_ACPI;
	device->fwnode.ops = &acpi_fwnode_ops;
	device->fwnode.ops = &acpi_device_fwnode_ops;
	acpi_set_device_status(device, sta);
	acpi_device_get_busid(device);
	acpi_set_pnp_ids(handle, &device->pnp, type);
+3 −2
Original line number Diff line number Diff line
@@ -25,9 +25,11 @@ struct property_set {
	const struct property_entry *properties;
};

static const struct fwnode_operations pset_fwnode_ops;

static inline bool is_pset_node(struct fwnode_handle *fwnode)
{
	return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_PDATA;
	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &pset_fwnode_ops;
}

static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
@@ -900,7 +902,6 @@ int device_add_properties(struct device *dev,
	if (IS_ERR(p))
		return PTR_ERR(p);

	p->fwnode.type = FWNODE_PDATA;
	p->fwnode.ops = &pset_fwnode_ops;
	set_secondary_fwnode(dev, &p->fwnode);
	return 0;
+1 −0
Original line number Diff line number Diff line
@@ -952,3 +952,4 @@ const struct fwnode_operations of_fwnode_ops = {
	.graph_get_port_parent = of_fwnode_graph_get_port_parent,
	.graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
};
EXPORT_SYMBOL_GPL(of_fwnode_ops);
+16 −4
Original line number Diff line number Diff line
@@ -395,15 +395,21 @@ struct acpi_data_node {
	struct completion kobj_done;
};

extern const struct fwnode_operations acpi_device_fwnode_ops;
extern const struct fwnode_operations acpi_data_fwnode_ops;
extern const struct fwnode_operations acpi_static_fwnode_ops;

static inline bool is_acpi_node(struct fwnode_handle *fwnode)
{
	return !IS_ERR_OR_NULL(fwnode) && (fwnode->type == FWNODE_ACPI
		|| fwnode->type == FWNODE_ACPI_DATA);
	return !IS_ERR_OR_NULL(fwnode) &&
		(fwnode->ops == &acpi_device_fwnode_ops
		 || fwnode->ops == &acpi_data_fwnode_ops);
}

static inline bool is_acpi_device_node(struct fwnode_handle *fwnode)
{
	return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_ACPI;
	return !IS_ERR_OR_NULL(fwnode) &&
		fwnode->ops == &acpi_device_fwnode_ops;
}

static inline struct acpi_device *to_acpi_device_node(struct fwnode_handle *fwnode)
@@ -414,7 +420,7 @@ static inline struct acpi_device *to_acpi_device_node(struct fwnode_handle *fwno

static inline bool is_acpi_data_node(struct fwnode_handle *fwnode)
{
	return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_ACPI_DATA;
	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
}

static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwnode)
@@ -423,6 +429,12 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn
		container_of(fwnode, struct acpi_data_node, fwnode) : NULL;
}

static inline bool is_acpi_static_node(struct fwnode_handle *fwnode)
{
	return !IS_ERR_OR_NULL(fwnode) &&
		fwnode->ops == &acpi_static_fwnode_ops;
}

static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
					const char *name)
{
Loading