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.
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_protocol_get()
85 pr_warn("SCMI Protocol 0x%x not found!\n", protocol_id); in scmi_protocol_get()
89 pr_debug("Found SCMI Protocol 0x%x\n", protocol_id); in scmi_protocol_get()
100 module_put(proto->owner); in scmi_protocol_put()
105 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_probe()
108 if (!scmi_dev->handle) in scmi_dev_probe()
109 return -EPROBE_DEFER; in scmi_dev_probe()
111 return scmi_drv->probe(scmi_dev); in scmi_dev_probe()
116 struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver); in scmi_dev_remove()
119 if (scmi_drv->remove) in scmi_dev_remove()
120 scmi_drv->remove(scmi_dev); in scmi_dev_remove()
135 if (!driver->probe) in scmi_driver_register()
136 return -EINVAL; in scmi_driver_register()
138 retval = scmi_protocol_device_request(driver->id_table); in scmi_driver_register()
142 driver->driver.bus = &scmi_bus_type; in scmi_driver_register()
143 driver->driver.name = driver->name; in scmi_driver_register()
144 driver->driver.owner = owner; in scmi_driver_register()
145 driver->driver.mod_name = mod_name; in scmi_driver_register()
147 retval = driver_register(&driver->driver); in scmi_driver_register()
149 pr_debug("registered new scmi driver %s\n", driver->name); in scmi_driver_register()
157 driver_unregister(&driver->driver); in scmi_driver_unregister()
158 scmi_protocol_device_unrequest(driver->id_table); in scmi_driver_unregister()
168 scmi_device_create(struct device_node *np, struct device *parent, int protocol, in scmi_device_create() argument
171 int id, retval; in scmi_device_create() local
178 scmi_dev->name = kstrdup_const(name ?: "unknown", GFP_KERNEL); in scmi_device_create()
179 if (!scmi_dev->name) { in scmi_device_create()
184 id = ida_alloc_min(&scmi_bus_id, 1, GFP_KERNEL); in scmi_device_create()
185 if (id < 0) { in scmi_device_create()
186 kfree_const(scmi_dev->name); in scmi_device_create()
191 scmi_dev->id = id; in scmi_device_create()
192 scmi_dev->protocol_id = protocol; in scmi_device_create()
193 scmi_dev->dev.parent = parent; in scmi_device_create()
194 scmi_dev->dev.of_node = np; in scmi_device_create()
195 scmi_dev->dev.bus = &scmi_bus_type; in scmi_device_create()
196 scmi_dev->dev.release = scmi_device_release; in scmi_device_create()
197 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); in scmi_device_create()
199 retval = device_register(&scmi_dev->dev); in scmi_device_create()
205 kfree_const(scmi_dev->name); in scmi_device_create()
206 put_device(&scmi_dev->dev); in scmi_device_create()
207 ida_free(&scmi_bus_id, id); in scmi_device_create()
213 kfree_const(scmi_dev->name); in scmi_device_destroy()
214 scmi_handle_put(scmi_dev->handle); in scmi_device_destroy()
215 ida_free(&scmi_bus_id, scmi_dev->id); in scmi_device_destroy()
216 device_unregister(&scmi_dev->dev); in scmi_device_destroy()
230 scmi_dev->handle = scmi_handle_get(&scmi_dev->dev); in scmi_set_handle()
231 if (scmi_dev->handle) in scmi_set_handle()
232 scmi_device_link_add(&scmi_dev->dev, scmi_dev->handle->dev); in scmi_set_handle()
240 pr_err("invalid protocol\n"); in scmi_protocol_register()
241 return -EINVAL; in scmi_protocol_register()
244 if (!proto->instance_init) { in scmi_protocol_register()
245 pr_err("missing init for protocol 0x%x\n", proto->id); in scmi_protocol_register()
246 return -EINVAL; in scmi_protocol_register()
251 proto->id, proto->id + 1, GFP_ATOMIC); in scmi_protocol_register()
253 if (ret != proto->id) { in scmi_protocol_register()
254 pr_err("unable to allocate SCMI idr slot for 0x%x - err %d\n", in scmi_protocol_register()
255 proto->id, ret); in scmi_protocol_register()
259 pr_debug("Registered SCMI Protocol 0x%x\n", proto->id); in scmi_protocol_register()
268 idr_remove(&scmi_protocols, proto->id); in scmi_protocol_unregister()
271 pr_debug("Unregistered SCMI Protocol 0x%x\n", proto->id); in scmi_protocol_unregister()
296 pr_err("scmi protocol bus register failed (%d)\n", retval); in scmi_bus_init()