return NULL;
 
        for (; id->protocol_id; id++)
-               if (id->protocol_id == scmi_dev->protocol_id)
-                       return id;
+               if (id->protocol_id == scmi_dev->protocol_id) {
+                       if (!id->name)
+                               return id;
+                       else if (!strcmp(id->name, scmi_dev->name))
+                               return id;
+               }
 
        return NULL;
 }
 }
 
 struct scmi_device *
-scmi_device_create(struct device_node *np, struct device *parent, int protocol)
+scmi_device_create(struct device_node *np, struct device *parent, int protocol,
+                  const char *name)
 {
        int id, retval;
        struct scmi_device *scmi_dev;
        if (!scmi_dev)
                return NULL;
 
+       scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL);
+       if (!scmi_dev->name) {
+               kfree(scmi_dev);
+               return NULL;
+       }
+
        id = ida_simple_get(&scmi_bus_id, 1, 0, GFP_KERNEL);
        if (id < 0) {
+               kfree_const(scmi_dev->name);
                kfree(scmi_dev);
                return NULL;
        }
 
        return scmi_dev;
 put_dev:
+       kfree_const(scmi_dev->name);
        put_device(&scmi_dev->dev);
        ida_simple_remove(&scmi_bus_id, id);
        return NULL;
 
 void scmi_device_destroy(struct scmi_device *scmi_dev)
 {
+       kfree_const(scmi_dev->name);
        scmi_handle_put(scmi_dev->handle);
        ida_simple_remove(&scmi_bus_id, scmi_dev->id);
        device_unregister(&scmi_dev->dev);
 
 
 static inline void
 scmi_create_protocol_device(struct device_node *np, struct scmi_info *info,
-                           int prot_id)
+                           int prot_id, const char *name)
 {
        struct scmi_device *sdev;
 
-       sdev = scmi_device_create(np, info->dev, prot_id);
+       sdev = scmi_device_create(np, info->dev, prot_id, name);
        if (!sdev) {
                dev_err(info->dev, "failed to create %d protocol device\n",
                        prot_id);
                        continue;
                }
 
-               scmi_create_protocol_device(child, info, prot_id);
+               scmi_create_protocol_device(child, info, prot_id, NULL);
        }
 
        return 0;
 
 struct scmi_device {
        u32 id;
        u8 protocol_id;
+       const char *name;
        struct device dev;
        struct scmi_handle *handle;
 };
 #define to_scmi_dev(d) container_of(d, struct scmi_device, dev)
 
 struct scmi_device *
-scmi_device_create(struct device_node *np, struct device *parent, int protocol);
+scmi_device_create(struct device_node *np, struct device *parent, int protocol,
+                  const char *name);
 void scmi_device_destroy(struct scmi_device *scmi_dev);
 
 struct scmi_device_id {
        u8 protocol_id;
+       const char *name;
 };
 
 struct scmi_driver {