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);
 
 
 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;
        }
        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
        }
 
  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;
 
        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;
 
        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);
 
        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)
        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;
 
        .graph_get_port_parent = of_fwnode_graph_get_port_parent,
        .graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
 };
+EXPORT_SYMBOL_GPL(of_fwnode_ops);
 
        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)
 
 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)
                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)
 {
 
        acpi_fwnode_handle(adev) : NULL)
 #define ACPI_HANDLE(dev)               acpi_device_handle(ACPI_COMPANION(dev))
 
-
-extern const struct fwnode_operations acpi_fwnode_ops;
-
 static inline struct fwnode_handle *acpi_alloc_fwnode_static(void)
 {
        struct fwnode_handle *fwnode;
        if (!fwnode)
                return NULL;
 
-       fwnode->type = FWNODE_ACPI_STATIC;
-       fwnode->ops = &acpi_fwnode_ops;
+       fwnode->ops = &acpi_static_fwnode_ops;
 
        return fwnode;
 }
 
 static inline void acpi_free_fwnode_static(struct fwnode_handle *fwnode)
 {
-       if (WARN_ON(!fwnode || fwnode->type != FWNODE_ACPI_STATIC))
+       if (WARN_ON(!is_acpi_static_node(fwnode)))
                return;
 
        kfree(fwnode);
 
 
 #include <linux/types.h>
 
-enum fwnode_type {
-       FWNODE_INVALID = 0,
-       FWNODE_OF,
-       FWNODE_ACPI,
-       FWNODE_ACPI_DATA,
-       FWNODE_ACPI_STATIC,
-       FWNODE_PDATA,
-       FWNODE_IRQCHIP
-};
-
 struct fwnode_operations;
 
 struct fwnode_handle {
-       enum fwnode_type type;
        struct fwnode_handle *secondary;
        const struct fwnode_operations *ops;
 };
 
        return node ? &node->fwnode : NULL;
 }
 
+extern const struct fwnode_operations irqchip_fwnode_ops;
+
 static inline bool is_fwnode_irqchip(struct fwnode_handle *fwnode)
 {
-       return fwnode && fwnode->type == FWNODE_IRQCHIP;
+       return fwnode && fwnode->ops == &irqchip_fwnode_ops;
 }
 
 extern void irq_domain_update_bus_token(struct irq_domain *domain,
 
 static inline void of_node_init(struct device_node *node)
 {
        kobject_init(&node->kobj, &of_node_ktype);
-       node->fwnode.type = FWNODE_OF;
        node->fwnode.ops = &of_fwnode_ops;
 }
 
 
 static inline bool is_of_node(const struct fwnode_handle *fwnode)
 {
-       return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_OF;
+       return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &of_fwnode_ops;
 }
 
 #define to_of_node(__fwnode)                                           \
 
 static inline void debugfs_remove_domain_dir(struct irq_domain *d) { }
 #endif
 
+const struct fwnode_operations irqchip_fwnode_ops;
+
 /**
  * irq_domain_alloc_fwnode - Allocate a fwnode_handle suitable for
  *                           identifying an irq domain
        fwid->type = type;
        fwid->name = n;
        fwid->data = data;
-       fwid->fwnode.type = FWNODE_IRQCHIP;
+       fwid->fwnode.ops = &irqchip_fwnode_ops;
        return &fwid->fwnode;
 }
 EXPORT_SYMBOL_GPL(__irq_domain_alloc_fwnode);
        }
 
        if (!domain->name) {
-               if (fwnode) {
-                       pr_err("Invalid fwnode type (%d) for irqdomain\n",
-                              fwnode->type);
-               }
+               if (fwnode)
+                       pr_err("Invalid fwnode type for irqdomain\n");
                domain->name = kasprintf(GFP_KERNEL, "unknown-%d",
                                         atomic_inc_return(&unknown_domains));
                if (!domain->name) {