Lines Matching +full:protocol +full:- +full:id
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.
40 * scmi_protocol_device_request - Helper to request a device
42 * @id_table: A protocol/name pair descriptor for the device to be created.
47 * The requested device name MUST NOT be already existent for this protocol;
60 pr_debug("Requesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_request()
61 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
66 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
67 return -EINVAL; in scmi_protocol_device_request()
71 * Find the matching protocol rdev list and then search of any in scmi_protocol_device_request()
75 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_protocol_device_request()
79 if (!strcmp(rdev->id_table->name, id_table->name)) { in scmi_protocol_device_request()
81 rdev->id_table->protocol_id, in scmi_protocol_device_request()
82 rdev->id_table->name); in scmi_protocol_device_request()
83 ret = -EINVAL; in scmi_protocol_device_request()
95 ret = -ENOMEM; in scmi_protocol_device_request()
98 rdev->id_table = id_table; in scmi_protocol_device_request()
102 * related protocol list, eventually creating such head if not already in scmi_protocol_device_request()
109 ret = -ENOMEM; in scmi_protocol_device_request()
115 id_table->protocol_id, in scmi_protocol_device_request()
116 id_table->protocol_id + 1, GFP_KERNEL); in scmi_protocol_device_request()
117 if (ret != id_table->protocol_id) { in scmi_protocol_device_request()
118 pr_err("Failed to save SCMI device - ret:%d\n", ret); in scmi_protocol_device_request()
121 ret = -EINVAL; in scmi_protocol_device_request()
126 list_add(&rdev->node, phead); in scmi_protocol_device_request()
134 (void *)rdev->id_table); in scmi_protocol_device_request()
144 for (entry = id_table; entry->name && ret == 0; entry++) in scmi_protocol_table_register()
151 * scmi_protocol_device_unrequest - Helper to unrequest a device
153 * @id_table: A protocol/name pair descriptor for the device to be unrequested.
164 pr_debug("Unrequesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_unrequest()
165 id_table->name, id_table->protocol_id); in scmi_protocol_device_unrequest()
168 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_protocol_device_unrequest()
173 if (!strcmp(victim->id_table->name, id_table->name)) { in scmi_protocol_device_unrequest()
174 list_del(&victim->node); in scmi_protocol_device_unrequest()
179 (void *)victim->id_table); in scmi_protocol_device_unrequest()
188 id_table->protocol_id); in scmi_protocol_device_unrequest()
200 for (entry = id_table; entry->name; entry++) in scmi_protocol_table_unregister()
207 const struct scmi_device_id *id = scmi_drv->id_table; in scmi_dev_match_id() local
209 if (!id) in scmi_dev_match_id()
212 for (; id->protocol_id; id++) in scmi_dev_match_id()
213 if (id->protocol_id == scmi_dev->protocol_id) { in scmi_dev_match_id()
214 if (!id->name) in scmi_dev_match_id()
215 return id; in scmi_dev_match_id()
216 else if (!strcmp(id->name, scmi_dev->name)) in scmi_dev_match_id()
217 return id; in scmi_dev_match_id()
227 const struct scmi_device_id *id; in scmi_dev_match() local
229 id = scmi_dev_match_id(scmi_dev, scmi_drv); in scmi_dev_match()
230 if (id) in scmi_dev_match()
241 return sdev->protocol_id == id_table->protocol_id && in scmi_match_by_id_table()
242 (id_table->name && !strcmp(sdev->name, id_table->name)); in scmi_match_by_id_table()
266 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_probe()
269 if (!scmi_dev->handle) in scmi_dev_probe()
270 return -EPROBE_DEFER; in scmi_dev_probe()
272 return scmi_drv->probe(scmi_dev); in scmi_dev_probe()
277 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_remove()
280 if (scmi_drv->remove) in scmi_dev_remove()
281 scmi_drv->remove(scmi_dev); in scmi_dev_remove()
289 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in scmi_device_uevent()
290 scmi_dev->name); in scmi_device_uevent()
299 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in modalias_show()
300 scmi_dev->name); in modalias_show()
309 return sprintf(buf, "0x%02x\n", scmi_dev->protocol_id); in protocol_id_show()
318 return sprintf(buf, "%s\n", scmi_dev->name); in name_show()
345 if (!driver->probe) in scmi_driver_register()
346 return -EINVAL; in scmi_driver_register()
348 retval = scmi_protocol_table_register(driver->id_table); in scmi_driver_register()
352 driver->driver.bus = &scmi_bus_type; in scmi_driver_register()
353 driver->driver.name = driver->name; in scmi_driver_register()
354 driver->driver.owner = owner; in scmi_driver_register()
355 driver->driver.mod_name = mod_name; in scmi_driver_register()
357 retval = driver_register(&driver->driver); in scmi_driver_register()
359 pr_debug("Registered new scmi driver %s\n", driver->name); in scmi_driver_register()
367 driver_unregister(&driver->driver); in scmi_driver_unregister()
368 scmi_protocol_table_unregister(driver->id_table); in scmi_driver_unregister()
376 kfree_const(scmi_dev->name); in scmi_device_release()
382 pr_debug("(%s) Destroying SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_destroy()
383 of_node_full_name(scmi_dev->dev.parent->of_node), in __scmi_device_destroy()
384 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in __scmi_device_destroy()
385 scmi_dev->name); in __scmi_device_destroy()
387 if (scmi_dev->protocol_id == SCMI_PROTOCOL_SYSTEM) in __scmi_device_destroy()
390 ida_free(&scmi_bus_id, scmi_dev->id); in __scmi_device_destroy()
391 device_unregister(&scmi_dev->dev); in __scmi_device_destroy()
396 int protocol, const char *name) in __scmi_device_create() argument
398 int id, retval; in __scmi_device_create() local
402 * If the same protocol/name device already exist under the same parent in __scmi_device_create()
405 * each DT defined protocol at probe time, and the concurrent in __scmi_device_create()
408 scmi_dev = scmi_child_dev_find(parent, protocol, name); in __scmi_device_create()
419 if (protocol == SCMI_PROTOCOL_SYSTEM && in __scmi_device_create()
422 "SCMI SystemPower protocol device must be unique !\n"); in __scmi_device_create()
430 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in __scmi_device_create()
431 if (!scmi_dev->name) { in __scmi_device_create()
436 id = ida_alloc_min(&scmi_bus_id, 1, GFP_KERNEL); in __scmi_device_create()
437 if (id < 0) { in __scmi_device_create()
438 kfree_const(scmi_dev->name); in __scmi_device_create()
443 scmi_dev->id = id; in __scmi_device_create()
444 scmi_dev->protocol_id = protocol; in __scmi_device_create()
445 scmi_dev->dev.parent = parent; in __scmi_device_create()
446 device_set_node(&scmi_dev->dev, of_fwnode_handle(np)); in __scmi_device_create()
447 scmi_dev->dev.bus = &scmi_bus_type; in __scmi_device_create()
448 scmi_dev->dev.release = scmi_device_release; in __scmi_device_create()
449 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in __scmi_device_create()
451 retval = device_register(&scmi_dev->dev); in __scmi_device_create()
455 pr_debug("(%s) Created SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_create()
456 of_node_full_name(parent->of_node), in __scmi_device_create()
457 dev_name(&scmi_dev->dev), protocol, name); in __scmi_device_create()
461 put_device(&scmi_dev->dev); in __scmi_device_create()
462 ida_free(&scmi_bus_id, id); in __scmi_device_create()
467 * scmi_device_create - A method to create one or more SCMI devices
471 * @protocol: The SCMI protocol to be associated with this device
472 * @name: The requested-name of the device to be created; this is optional
474 * be requested on the SCMI bus for @protocol will be created.
476 * This method can be invoked to create a single well-defined device (like
480 * protocol (typically during SCMI core protocol enumeration at probe time).
486 * could have been potentially created for a whole protocol, unless no
487 * device was found to have been requested for that specific protocol.
490 struct device *parent, int protocol, in scmi_device_create() argument
498 return __scmi_device_create(np, parent, protocol, name); in scmi_device_create()
501 phead = idr_find(&scmi_requested_devices, protocol); in scmi_device_create()
508 /* Walk the list of requested devices for protocol and create them */ in scmi_device_create()
513 rdev->id_table->protocol_id, in scmi_device_create()
514 rdev->id_table->name); in scmi_device_create()
519 pr_err("(%s) Failed to create device for protocol 0x%x (%s)\n", in scmi_device_create()
520 of_node_full_name(parent->of_node), in scmi_device_create()
521 rdev->id_table->protocol_id, in scmi_device_create()
522 rdev->id_table->name); in scmi_device_create()
530 void scmi_device_destroy(struct device *parent, int protocol, const char *name) in scmi_device_destroy() argument
534 scmi_dev = scmi_child_dev_find(parent, protocol, name); in scmi_device_destroy()
559 pr_err("SCMI protocol bus register failed (%d)\n", retval); in scmi_bus_init()
561 pr_info("SCMI protocol bus registered\n"); in scmi_bus_init()
579 MODULE_ALIAS("scmi-core");
581 MODULE_DESCRIPTION("ARM SCMI protocol bus");