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.
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;
55 unsigned int id = 0; in scmi_protocol_device_request() local
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()
74 idr_for_each_entry(&scmi_requested_devices, head, id) { 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()
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()
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() local
194 if (!id) 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()
200 return id; in scmi_dev_match_id()
201 else if (!strcmp(id->name, scmi_dev->name)) in scmi_dev_match_id()
202 return id; in scmi_dev_match_id()
212 const struct scmi_device_id *id; in scmi_dev_match() local
214 id = scmi_dev_match_id(scmi_dev, scmi_drv); in scmi_dev_match()
215 if (id) in scmi_dev_match()
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()
313 pr_debug("(%s) Destroying SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_destroy()
314 of_node_full_name(scmi_dev->dev.parent->of_node), in __scmi_device_destroy()
315 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in __scmi_device_destroy()
316 scmi_dev->name); in __scmi_device_destroy()
318 if (scmi_dev->protocol_id == SCMI_PROTOCOL_SYSTEM) in __scmi_device_destroy()
321 kfree_const(scmi_dev->name); in __scmi_device_destroy()
322 ida_free(&scmi_bus_id, scmi_dev->id); in __scmi_device_destroy()
323 device_unregister(&scmi_dev->dev); in __scmi_device_destroy()
328 int protocol, const char *name) in __scmi_device_create() argument
330 int id, retval; in __scmi_device_create() local
334 * If the same protocol/name device already exist under the same parent in __scmi_device_create()
337 * each DT defined protocol at probe time, and the concurrent in __scmi_device_create()
340 scmi_dev = scmi_child_dev_find(parent, protocol, name); in __scmi_device_create()
351 if (protocol == SCMI_PROTOCOL_SYSTEM && in __scmi_device_create()
354 "SCMI SystemPower protocol device must be unique !\n"); in __scmi_device_create()
362 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in __scmi_device_create()
363 if (!scmi_dev->name) { in __scmi_device_create()
368 id = ida_alloc_min(&scmi_bus_id, 1, GFP_KERNEL); in __scmi_device_create()
369 if (id < 0) { in __scmi_device_create()
370 kfree_const(scmi_dev->name); in __scmi_device_create()
375 scmi_dev->id = id; in __scmi_device_create()
376 scmi_dev->protocol_id = protocol; in __scmi_device_create()
377 scmi_dev->dev.parent = parent; in __scmi_device_create()
378 device_set_node(&scmi_dev->dev, of_fwnode_handle(np)); in __scmi_device_create()
379 scmi_dev->dev.bus = &scmi_bus_type; in __scmi_device_create()
380 scmi_dev->dev.release = scmi_device_release; in __scmi_device_create()
381 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in __scmi_device_create()
383 retval = device_register(&scmi_dev->dev); in __scmi_device_create()
387 pr_debug("(%s) Created SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_create()
388 of_node_full_name(parent->of_node), in __scmi_device_create()
389 dev_name(&scmi_dev->dev), protocol, name); in __scmi_device_create()
393 kfree_const(scmi_dev->name); in __scmi_device_create()
394 put_device(&scmi_dev->dev); in __scmi_device_create()
395 ida_free(&scmi_bus_id, id); in __scmi_device_create()
400 * scmi_device_create - A method to create one or more SCMI devices
404 * @protocol: The SCMI protocol to be associated with this device
405 * @name: The requested-name of the device to be created; this is optional
407 * be requested on the SCMI bus for @protocol will be created.
409 * This method can be invoked to create a single well-defined device (like
413 * protocol (typically during SCMI core protocol enumeration at probe time).
419 * could have been potentially created for a whole protocol, unless no
420 * device was found to have been requested for that specific protocol.
423 struct device *parent, int protocol, in scmi_device_create() argument
431 return __scmi_device_create(np, parent, protocol, name); in scmi_device_create()
434 phead = idr_find(&scmi_requested_devices, protocol); in scmi_device_create()
441 /* Walk the list of requested devices for protocol and create them */ in scmi_device_create()
446 rdev->id_table->protocol_id, in scmi_device_create()
447 rdev->id_table->name); in scmi_device_create()
452 pr_err("(%s) Failed to create device for protocol 0x%x (%s)\n", in scmi_device_create()
453 of_node_full_name(parent->of_node), in scmi_device_create()
454 rdev->id_table->protocol_id, in scmi_device_create()
455 rdev->id_table->name); in scmi_device_create()
463 void scmi_device_destroy(struct device *parent, int protocol, const char *name) in scmi_device_destroy() argument
467 scmi_dev = scmi_child_dev_find(parent, protocol, name); in scmi_device_destroy()
492 pr_err("SCMI protocol bus register failed (%d)\n", retval); in scmi_bus_init()
494 pr_info("SCMI protocol bus registered\n"); in scmi_bus_init()
512 MODULE_ALIAS("scmi-core");
514 MODULE_DESCRIPTION("ARM SCMI protocol bus");