• Home
  • Raw
  • Download

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 this protocol;
58 pr_debug("Requesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_request()
59 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
64 id_table->name, id_table->protocol_id); in scmi_protocol_device_request()
65 return -EINVAL; in scmi_protocol_device_request()
69 * Find the matching protocol rdev list and then search of any in scmi_protocol_device_request()
73 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_protocol_device_request()
76 list_for_each_entry(rdev, head, node) { in scmi_protocol_device_request()
77 if (!strcmp(rdev->id_table->name, id_table->name)) { in scmi_protocol_device_request()
79 rdev->id_table->protocol_id, in scmi_protocol_device_request()
80 rdev->id_table->name); in scmi_protocol_device_request()
81 ret = -EINVAL; in scmi_protocol_device_request()
93 ret = -ENOMEM; in scmi_protocol_device_request()
96 rdev->id_table = id_table; in scmi_protocol_device_request()
100 * related protocol list, eventually creating such head if not already in scmi_protocol_device_request()
107 ret = -ENOMEM; in scmi_protocol_device_request()
113 id_table->protocol_id, in scmi_protocol_device_request()
114 id_table->protocol_id + 1, GFP_KERNEL); in scmi_protocol_device_request()
115 if (ret != id_table->protocol_id) { in scmi_protocol_device_request()
116 pr_err("Failed to save SCMI device - ret:%d\n", ret); in scmi_protocol_device_request()
119 ret = -EINVAL; in scmi_protocol_device_request()
124 list_add(&rdev->node, phead); in scmi_protocol_device_request()
132 (void *)rdev->id_table); in scmi_protocol_device_request()
138 * scmi_protocol_device_unrequest - Helper to unrequest a device
140 * @id_table: A protocol/name pair descriptor for the device to be unrequested.
151 pr_debug("Unrequesting SCMI device (%s) for protocol %x\n", in scmi_protocol_device_unrequest()
152 id_table->name, id_table->protocol_id); in scmi_protocol_device_unrequest()
155 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_protocol_device_unrequest()
159 list_for_each_entry_safe(victim, tmp, phead, node) { in scmi_protocol_device_unrequest()
160 if (!strcmp(victim->id_table->name, id_table->name)) { in scmi_protocol_device_unrequest()
161 list_del(&victim->node); in scmi_protocol_device_unrequest()
166 (void *)victim->id_table); in scmi_protocol_device_unrequest()
175 id_table->protocol_id); in scmi_protocol_device_unrequest()
185 const struct scmi_device_id *id = scmi_drv->id_table; in scmi_dev_match_id()
190 for (; id->protocol_id; id++) in scmi_dev_match_id()
191 if (id->protocol_id == scmi_dev->protocol_id) { in scmi_dev_match_id()
192 if (!id->name) in scmi_dev_match_id()
194 else if (!strcmp(id->name, scmi_dev->name)) in scmi_dev_match_id()
219 return sdev->protocol_id == id_table->protocol_id && in scmi_match_by_id_table()
220 (id_table->name && !strcmp(sdev->name, id_table->name)); in scmi_match_by_id_table()
244 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_probe()
247 if (!scmi_dev->handle) in scmi_dev_probe()
248 return -EPROBE_DEFER; in scmi_dev_probe()
250 return scmi_drv->probe(scmi_dev); in scmi_dev_probe()
255 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_remove()
258 if (scmi_drv->remove) in scmi_dev_remove()
259 scmi_drv->remove(scmi_dev); in scmi_dev_remove()
275 if (!driver->probe) in scmi_driver_register()
276 return -EINVAL; in scmi_driver_register()
278 retval = scmi_protocol_device_request(driver->id_table); in scmi_driver_register()
282 driver->driver.bus = &scmi_bus_type; in scmi_driver_register()
283 driver->driver.name = driver->name; in scmi_driver_register()
284 driver->driver.owner = owner; in scmi_driver_register()
285 driver->driver.mod_name = mod_name; in scmi_driver_register()
287 retval = driver_register(&driver->driver); in scmi_driver_register()
289 pr_debug("Registered new scmi driver %s\n", driver->name); in scmi_driver_register()
297 driver_unregister(&driver->driver); in scmi_driver_unregister()
298 scmi_protocol_device_unrequest(driver->id_table); in scmi_driver_unregister()
306 kfree_const(scmi_dev->name); in scmi_device_release()
312 pr_debug("(%s) Destroying SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_destroy()
313 of_node_full_name(scmi_dev->dev.parent->of_node), in __scmi_device_destroy()
314 dev_name(&scmi_dev->dev), scmi_dev->protocol_id, in __scmi_device_destroy()
315 scmi_dev->name); in __scmi_device_destroy()
317 if (scmi_dev->protocol_id == SCMI_PROTOCOL_SYSTEM) in __scmi_device_destroy()
320 ida_free(&scmi_bus_id, scmi_dev->id); in __scmi_device_destroy()
321 device_unregister(&scmi_dev->dev); in __scmi_device_destroy()
326 int protocol, const char *name) in __scmi_device_create() argument
332 * If the same protocol/name device already exist under the same parent in __scmi_device_create()
335 * each DT defined protocol at probe time, and the concurrent in __scmi_device_create()
338 scmi_dev = scmi_child_dev_find(parent, protocol, name); in __scmi_device_create()
349 if (protocol == SCMI_PROTOCOL_SYSTEM && in __scmi_device_create()
352 "SCMI SystemPower protocol device must be unique !\n"); in __scmi_device_create()
360 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in __scmi_device_create()
361 if (!scmi_dev->name) { in __scmi_device_create()
368 kfree_const(scmi_dev->name); in __scmi_device_create()
373 scmi_dev->id = id; in __scmi_device_create()
374 scmi_dev->protocol_id = protocol; in __scmi_device_create()
375 scmi_dev->dev.parent = parent; in __scmi_device_create()
376 device_set_node(&scmi_dev->dev, of_fwnode_handle(np)); in __scmi_device_create()
377 scmi_dev->dev.bus = &scmi_bus_type; in __scmi_device_create()
378 scmi_dev->dev.release = scmi_device_release; in __scmi_device_create()
379 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in __scmi_device_create()
381 retval = device_register(&scmi_dev->dev); in __scmi_device_create()
385 pr_debug("(%s) Created SCMI device '%s' for protocol 0x%x (%s)\n", in __scmi_device_create()
386 of_node_full_name(parent->of_node), in __scmi_device_create()
387 dev_name(&scmi_dev->dev), protocol, name); in __scmi_device_create()
391 put_device(&scmi_dev->dev); in __scmi_device_create()
397 * scmi_device_create - A method to create one or more SCMI devices
399 * @np: A reference to the device node to use for the new device(s)
401 * @protocol: The SCMI protocol to be associated with this device
402 * @name: The requested-name of the device to be created; this is optional
404 * be requested on the SCMI bus for @protocol will be created.
406 * This method can be invoked to create a single well-defined device (like
410 * protocol (typically during SCMI core protocol enumeration at probe time).
416 * could have been potentially created for a whole protocol, unless no
417 * device was found to have been requested for that specific protocol.
420 struct device *parent, int protocol, in scmi_device_create() argument
428 return __scmi_device_create(np, parent, protocol, name); in scmi_device_create()
431 phead = idr_find(&scmi_requested_devices, protocol); in scmi_device_create()
438 /* Walk the list of requested devices for protocol and create them */ in scmi_device_create()
439 list_for_each_entry(rdev, phead, node) { in scmi_device_create()
443 rdev->id_table->protocol_id, in scmi_device_create()
444 rdev->id_table->name); in scmi_device_create()
449 pr_err("(%s) Failed to create device for protocol 0x%x (%s)\n", in scmi_device_create()
450 of_node_full_name(parent->of_node), in scmi_device_create()
451 rdev->id_table->protocol_id, in scmi_device_create()
452 rdev->id_table->name); in scmi_device_create()
460 void scmi_device_destroy(struct device *parent, int protocol, const char *name) in scmi_device_destroy() argument
464 scmi_dev = scmi_child_dev_find(parent, protocol, name); in scmi_device_destroy()
489 pr_err("SCMI protocol bus register failed (%d)\n", retval); in scmi_bus_init()
491 pr_info("SCMI protocol bus registered\n"); in scmi_bus_init()
509 MODULE_ALIAS("scmi-core");
511 MODULE_DESCRIPTION("ARM SCMI protocol bus");