Lines Matching +full:protocol +full:- +full:node
1 // SPDX-License-Identifier: GPL-2.0
3 * System Control and Management Interface (SCMI) Message Protocol bus layer
5 * Copyright (C) 2018-2021 ARM Ltd.
31 struct list_head node; member
38 * scmi_protocol_device_request - Helper to request a device
40 * @id_table: A protocol/name pair descriptor for the device to be created.
45 * The requested device name MUST NOT be already existent for any protocol;
59 pr_debug("Requesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_request()
60 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
65 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
66 return -EINVAL; in scmi_protocol_device_request()
70 * Search for the matching protocol rdev list and then search in scmi_protocol_device_request()
78 node); in scmi_protocol_device_request()
79 if (rdev->id_table->protocol_id == in scmi_protocol_device_request()
80 id_table->protocol_id) in scmi_protocol_device_request()
83 list_for_each_entry(rdev, head, node) { in scmi_protocol_device_request()
84 if (!strcmp(rdev->id_table->name, id_table->name)) { in scmi_protocol_device_request()
86 rdev->id_table->protocol_id, in scmi_protocol_device_request()
87 rdev->id_table->name); in scmi_protocol_device_request()
88 ret = -EINVAL; in scmi_protocol_device_request()
100 ret = -ENOMEM; in scmi_protocol_device_request()
103 rdev->id_table = id_table; in scmi_protocol_device_request()
107 * related protocol list, eventually creating such head if not already in scmi_protocol_device_request()
114 ret = -ENOMEM; in scmi_protocol_device_request()
120 id_table->protocol_id, in scmi_protocol_device_request()
121 id_table->protocol_id + 1, GFP_KERNEL); in scmi_protocol_device_request()
122 if (ret != id_table->protocol_id) { in scmi_protocol_device_request()
123 pr_err("Failed to save SCMI device - ret:%d\n", ret); in scmi_protocol_device_request()
126 ret = -EINVAL; in scmi_protocol_device_request()
131 list_add(&rdev->node, phead); in scmi_protocol_device_request()
139 (void *)rdev->id_table); in scmi_protocol_device_request()
145 * scmi_protocol_device_unrequest - Helper to unrequest a device
147 * @id_table: A protocol/name pair descriptor for the device to be unrequested.
158 pr_debug("Unrequesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_unrequest()
159 id_table->name, id_table->protocol_id); in scmi_protocol_device_unrequest()
162 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_protocol_device_unrequest()
166 list_for_each_entry_safe(victim, tmp, phead, node) { in scmi_protocol_device_unrequest()
167 if (!strcmp(victim->id_table->name, id_table->name)) { in scmi_protocol_device_unrequest()
168 list_del(&victim->node); in scmi_protocol_device_unrequest()
173 (void *)victim->id_table); in scmi_protocol_device_unrequest()
182 id_table->protocol_id); in scmi_protocol_device_unrequest()
192 const struct scmi_device_id *id = scmi_drv->id_table; in scmi_dev_match_id()
197 for (; id->protocol_id; id++) in scmi_dev_match_id()
198 if (id->protocol_id == scmi_dev->protocol_id) { in scmi_dev_match_id()
199 if (!id->name) in scmi_dev_match_id()
201 else if (!strcmp(id->name, scmi_dev->name)) in scmi_dev_match_id()
226 return sdev->protocol_id == id_table->protocol_id && in scmi_match_by_id_table()
227 (id_table->name && !strcmp(sdev->name, id_table->name)); in scmi_match_by_id_table()
248 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_probe()
251 if (!scmi_dev->handle) in scmi_dev_probe()
252 return -EPROBE_DEFER; in scmi_dev_probe()
254 return scmi_drv->probe(scmi_dev); in scmi_dev_probe()
259 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_remove()
262 if (scmi_drv->remove) in scmi_dev_remove()
263 scmi_drv->remove(scmi_dev); in scmi_dev_remove()
279 if (!driver->probe) in scmi_driver_register()
280 return -EINVAL; in scmi_driver_register()
282 retval = scmi_protocol_device_request(driver->id_table); in scmi_driver_register()
286 driver->driver.bus = &scmi_bus_type; in scmi_driver_register()
287 driver->driver.name = driver->name; in scmi_driver_register()
288 driver->driver.owner = owner; in scmi_driver_register()
289 driver->driver.mod_name = mod_name; in scmi_driver_register()
291 retval = driver_register(&driver->driver); in scmi_driver_register()
293 pr_debug("Registered new scmi driver %s\n", driver->name); in scmi_driver_register()
301 driver_unregister(&driver->driver); in scmi_driver_unregister()
302 scmi_protocol_device_unrequest(driver->id_table); in scmi_driver_unregister()
310 kfree_const(scmi_dev->name); in scmi_device_release()
316 pr_debug("(%s) Destroying SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_destroy()
317 of_node_full_name(scmi_dev->dev.parent->of_node), in __scmi_device_destroy()
318 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in __scmi_device_destroy()
319 scmi_dev->name); in __scmi_device_destroy()
321 if (scmi_dev->protocol_id == SCMI_PROTOCOL_SYSTEM) in __scmi_device_destroy()
324 ida_free(&scmi_bus_id, scmi_dev->id); in __scmi_device_destroy()
325 device_unregister(&scmi_dev->dev); in __scmi_device_destroy()
330 int protocol, const char *name) in __scmi_device_create() argument
336 * If the same protocol/name device already exist under the same parent in __scmi_device_create()
339 * each DT defined protocol at probe time, and the concurrent in __scmi_device_create()
342 scmi_dev = scmi_child_dev_find(parent, protocol, name); in __scmi_device_create()
353 if (protocol == SCMI_PROTOCOL_SYSTEM && in __scmi_device_create()
356 "SCMI SystemPower protocol device must be unique !\n"); in __scmi_device_create()
364 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in __scmi_device_create()
365 if (!scmi_dev->name) { in __scmi_device_create()
372 kfree_const(scmi_dev->name); in __scmi_device_create()
377 scmi_dev->id = id; in __scmi_device_create()
378 scmi_dev->protocol_id = protocol; in __scmi_device_create()
379 scmi_dev->dev.parent = parent; in __scmi_device_create()
380 device_set_node(&scmi_dev->dev, of_fwnode_handle(np)); in __scmi_device_create()
381 scmi_dev->dev.bus = &scmi_bus_type; in __scmi_device_create()
382 scmi_dev->dev.release = scmi_device_release; in __scmi_device_create()
383 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in __scmi_device_create()
385 retval = device_register(&scmi_dev->dev); in __scmi_device_create()
389 pr_debug("(%s) Created SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_create()
390 of_node_full_name(parent->of_node), in __scmi_device_create()
391 dev_name(&scmi_dev->dev), protocol, name); in __scmi_device_create()
395 put_device(&scmi_dev->dev); in __scmi_device_create()
401 * scmi_device_create - A method to create one or more SCMI devices
403 * @np: A reference to the device node to use for the new device(s)
405 * @protocol: The SCMI protocol to be associated with this device
406 * @name: The requested-name of the device to be created; this is optional
408 * be requested on the SCMI bus for @protocol will be created.
410 * This method can be invoked to create a single well-defined device (like
414 * protocol (typically during SCMI core protocol enumeration at probe time).
420 * could have been potentially created for a whole protocol, unless no
421 * device was found to have been requested for that specific protocol.
424 struct device *parent, int protocol, in scmi_device_create() argument
432 return __scmi_device_create(np, parent, protocol, name); in scmi_device_create()
435 phead = idr_find(&scmi_requested_devices, protocol); in scmi_device_create()
442 /* Walk the list of requested devices for protocol and create them */ in scmi_device_create()
443 list_for_each_entry(rdev, phead, node) { in scmi_device_create()
447 rdev->id_table->protocol_id, in scmi_device_create()
448 rdev->id_table->name); in scmi_device_create()
453 pr_err("(%s) Failed to create device for protocol 0x%x (%s)\n", in scmi_device_create()
454 of_node_full_name(parent->of_node), in scmi_device_create()
455 rdev->id_table->protocol_id, in scmi_device_create()
456 rdev->id_table->name); in scmi_device_create()
464 void scmi_device_destroy(struct device *parent, int protocol, const char *name) in scmi_device_destroy() argument
468 scmi_dev = scmi_child_dev_find(parent, protocol, name); in scmi_device_destroy()
493 pr_err("SCMI protocol bus register failed (%d)\n", retval); in scmi_bus_init()
495 pr_info("SCMI protocol bus registered\n"); in scmi_bus_init()
513 MODULE_ALIAS("scmi-core");
515 MODULE_DESCRIPTION("ARM SCMI protocol bus");