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
25 const struct scmi_device_id *id = scmi_drv->id_table; in scmi_dev_match_id() local
27 if (!id) in scmi_dev_match_id()
30 for (; id->protocol_id; id++) in scmi_dev_match_id()
31 if (id->protocol_id == scmi_dev->protocol_id) { in scmi_dev_match_id()
32 if (!id->name) in scmi_dev_match_id()
33 return id; in scmi_dev_match_id()
34 else if (!strcmp(id->name, scmi_dev->name)) in scmi_dev_match_id()
35 return id; in scmi_dev_match_id()
45 const struct scmi_device_id *id; in scmi_dev_match() local
47 id = scmi_dev_match_id(scmi_dev, scmi_drv); in scmi_dev_match()
48 if (id) in scmi_dev_match()
59 return sdev->protocol_id == id_table->protocol_id && in scmi_match_by_id_table()
60 !strcmp(sdev->name, id_table->name); in scmi_match_by_id_table()
84 if (!proto || !try_module_get(proto->owner)) { in scmi_get_protocol()
85 pr_warn("SCMI Protocol 0x%x not found!\n", protocol_id); in scmi_get_protocol()
89 pr_debug("GOT SCMI Protocol 0x%x\n", protocol_id); in scmi_get_protocol()
100 module_put(proto->owner); in scmi_put_protocol()
105 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_probe()
107 const struct scmi_device_id *id; in scmi_dev_probe() local
109 id = scmi_dev_match_id(scmi_dev, scmi_drv); in scmi_dev_probe()
110 if (!id) in scmi_dev_probe()
111 return -ENODEV; in scmi_dev_probe()
113 if (!scmi_dev->handle) in scmi_dev_probe()
114 return -EPROBE_DEFER; in scmi_dev_probe()
116 return scmi_drv->probe(scmi_dev); in scmi_dev_probe()
121 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_remove()
124 if (scmi_drv->remove) in scmi_dev_remove()
125 scmi_drv->remove(scmi_dev); in scmi_dev_remove()
142 if (!driver->probe) in scmi_driver_register()
143 return -EINVAL; in scmi_driver_register()
145 retval = scmi_request_protocol_device(driver->id_table); in scmi_driver_register()
149 driver->driver.bus = &scmi_bus_type; in scmi_driver_register()
150 driver->driver.name = driver->name; in scmi_driver_register()
151 driver->driver.owner = owner; in scmi_driver_register()
152 driver->driver.mod_name = mod_name; in scmi_driver_register()
154 retval = driver_register(&driver->driver); in scmi_driver_register()
156 pr_debug("registered new scmi driver %s\n", driver->name); in scmi_driver_register()
164 driver_unregister(&driver->driver); in scmi_driver_unregister()
165 scmi_unrequest_protocol_device(driver->id_table); in scmi_driver_unregister()
175 scmi_device_create(struct device_node *np, struct device *parent, int protocol, in scmi_device_create() argument
178 int id, retval; in scmi_device_create() local
185 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in scmi_device_create()
186 if (!scmi_dev->name) { in scmi_device_create()
191 id = ida_simple_get(&scmi_bus_id, 1, 0, GFP_KERNEL); in scmi_device_create()
192 if (id < 0) { in scmi_device_create()
193 kfree_const(scmi_dev->name); in scmi_device_create()
198 scmi_dev->id = id; in scmi_device_create()
199 scmi_dev->protocol_id = protocol; in scmi_device_create()
200 scmi_dev->dev.parent = parent; in scmi_device_create()
201 scmi_dev->dev.of_node = np; in scmi_device_create()
202 scmi_dev->dev.bus = &scmi_bus_type; in scmi_device_create()
203 scmi_dev->dev.release = scmi_device_release; in scmi_device_create()
204 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in scmi_device_create()
206 retval = device_register(&scmi_dev->dev); in scmi_device_create()
212 kfree_const(scmi_dev->name); in scmi_device_create()
213 put_device(&scmi_dev->dev); in scmi_device_create()
214 ida_simple_remove(&scmi_bus_id, id); in scmi_device_create()
220 kfree_const(scmi_dev->name); in scmi_device_destroy()
221 scmi_handle_put(scmi_dev->handle); in scmi_device_destroy()
222 ida_simple_remove(&scmi_bus_id, scmi_dev->id); in scmi_device_destroy()
223 device_unregister(&scmi_dev->dev); in scmi_device_destroy()
228 scmi_dev->handle = scmi_handle_get(&scmi_dev->dev); in scmi_set_handle()
236 pr_err("invalid protocol\n"); in scmi_protocol_register()
237 return -EINVAL; in scmi_protocol_register()
240 if (!proto->init_instance) { in scmi_protocol_register()
241 pr_err("missing .init() for protocol 0x%x\n", proto->id); in scmi_protocol_register()
242 return -EINVAL; in scmi_protocol_register()
247 proto->id, proto->id + 1, GFP_ATOMIC); in scmi_protocol_register()
249 if (ret != proto->id) { in scmi_protocol_register()
250 pr_err("unable to allocate SCMI idr slot for 0x%x - err %d\n", in scmi_protocol_register()
251 proto->id, ret); in scmi_protocol_register()
255 pr_debug("Registered SCMI Protocol 0x%x\n", proto->id); in scmi_protocol_register()
264 idr_remove(&scmi_available_protocols, proto->id); in scmi_protocol_unregister()
267 pr_debug("Unregistered SCMI Protocol 0x%x\n", proto->id); in scmi_protocol_unregister()
292 pr_err("scmi protocol bus register failed (%d)\n", retval); in scmi_bus_init()